我无法在 c# asp.net MVC 中将 StringBuilder 转换为字符串

I am unable to convert StringBuilder to string in c# asp.net MVC

我的发票 class 有一个 StringBuilder 属性,因此如果进行了调整,用户会添加注释作为进行调整的详细信息。此 属性 在创建时设置为一个新的空 StringBuilder。只有在编辑模式下才会添加 .Append()。据我了解,这比每次添加新笔记时使用 adjustmentNotes += newAdjustmentNotes 更有效。

我的Invoice.csclass如下

public class Invoice
{
    [Key]
    public int InvoiceID { get; set; }

    [ForeignKey(nameof(Customer))]
    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }

    public virtual ICollection<Job> Jobs { get; set; }
    public double  InvoiceAmount { get; set; }
    public StringBuilder AdjustmentNotes { get; set; }
    public bool Paid { get; set; }
}

填充列表或详细信息视图时,我按如下方式查询数据库:

using (var ctx = new ApplicationDbContext())
{
    var query = ctx.Invoices
                   .Where(e => e.InvoiceID >= 0)
                   .Select(e => new InvoiceListItem
                                    {
                                         InvoiceID = e.InvoiceID,
                                         CustomerID = e.CustomerID,
                                         InvoiceAmount = e.InvoiceAmount,
                                         Paid = e.Paid,
                                         AdjustmentNotes = e.AdjustmentNotes.ToString()
                                    });
    return query.ToArray();
}

然后我收到以下错误消息。

System.NotSupportedException: 'Values of type 'StringBuilder' can not be converted to string.'

但根据 Microsoft 文档、此论坛上的其他问题以及各种资源,这是实现此目的的正确方法。

我当然可以将它改回字符串并根据需要使用 += 。这个特定的 属性 不会有太多注释,但是有人可以解释一下我做错了什么吗?非常感谢!

编辑:为了澄清,这是我的 InvoiceListItem 模型 class:

public class InvoiceListItem
{
    public int InvoiceID { get; set; }
    public int CustomerID { get; set; }
    
    public  List<int> JobIDs { get; set; }
    public double InvoiceAmount { get; set; }

    [UIHint("Bool")]
    public bool Paid { get; set; }
    public string AdjustmentNotes { get; set; }
}

EF Core 在错误消息中说:

I don't know how convert StringBuilder.ToString() to target database language.

解决方法是在查询后做转换:

var result = ctx.Invoices
    .Where(e => e.InvoiceID >= 0)
    .ToList() // First execute the query
    .Select( // Second convert Invoice to InvoiceListItem
        e => new InvoiceListItem {
            InvoiceID = e.InvoiceID,
            CustomerID = e.CustomerID,
            InvoiceAmount = e.InvoiceAmount,
            Paid = e.Paid,
            AdjustmentNotes = e.AdjustmentNotes.ToString()
        }
    );

如果你想在查询中限制返回的属性,你可以使用像这样的中间类型:

var query = ctx.Invoices
    .Where(e => e.InvoiceID >= 0)
    .Select(
        e => new {
            e.InvoiceID,
            e.CustomerID,
            e.InvoiceAmount,
            e.Paid,
            AdjustmentNotes
        }
    );
var result = query.ToList().
    .Select(
        e => new InvoiceListItem {
            InvoiceID = e.InvoiceID,
            CustomerID = e.CustomerID,
            InvoiceAmount = e.InvoiceAmount,
            Paid = e.Paid,
            AdjustmentNotes = e.AdjustmentNotes.ToString()
        }
    );

PS : 我没有找到有关 EF Core 支持 StringBuilder 类型的信息,但是 您的上下文模型已成功构建,然后 EF Core 似乎支持 StringBuilder 类型...

如果有支持,似乎非常有限(请参阅您问题中的错误)。也许您可以考虑在实体 class.

中使用 String 而不是 StringBuilder