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

我无法在c#asp.net MVC中将StringBuilder转换为字符串,c#,asp.net-mvc,entity-framework,linq,razor,C#,Asp.net Mvc,Entity Framework,Linq,Razor,My invoice类有一个StringBuilder属性,因此,如果进行了调整,用户会添加注释作为调整原因的详细信息。此属性在创建时设置为新的空StringBuilder。只有在编辑模式下,才会将其添加到。据我所知,这比每次添加新注释时使用adjustmentNotes+=newAdjustmentNotes更有效 我的Invoice.cs课程如下 public class Invoice { [Key] public int InvoiceID { get; set; }

My invoice类有一个
StringBuilder
属性,因此,如果进行了调整,用户会添加注释作为调整原因的详细信息。此属性在创建时设置为新的空
StringBuilder
。只有在编辑模式下,才会将其添加到。据我所知,这比每次添加新注释时使用
adjustmentNotes+=newAdjustmentNotes
更有效

我的Invoice.cs课程如下

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; }
}
然后我得到以下错误消息

System.NotSupportedException:“无法将StringBuilder类型的值转换为字符串。”

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

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

编辑:为了澄清,这里是我的
InvoiceListItem
model类:

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; }
}
公共类InvoiceListItem
{
public int InvoiceID{get;set;}
public int CustomerID{get;set;}
公共列表作业ID{get;set;}
公共双发票金额{get;set;}
[UIHint(“Bool”)]
公共bool付费{get;set;}
公共字符串调整注释{get;set;}
}

EF Core在错误消息中说:

我不知道如何将
StringBuilder.ToString()
转换为目标数据库语言

解决方案是在查询后进行转换:

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()
        }
    );
附言: 我没有找到关于EF核心支持
StringBuilder
type的信息,但是 您的上下文模型是成功构建的,那么EF Core似乎支持
StringBuilder
type


如果有支持,它似乎非常有限(请参阅问题中的错误)。在实体类中,您可以考虑使用<代码>字符串>代码>代替<代码> StringBuilder < /C>。一般来说,您不希望String Bu建器在模型中,您需要字符串,只要使用String Bu建器就可以根据需要构建字符串。它更像是一个临时类,可以帮助您有效地处理字符串。但从根本上说,它只会导致字符串如果删除'AdjustmentNotes=e.AdjustmentNotes.ToString()'行会发生什么?它仍然抛出吗?@Jawad我的AdjustmentNotes的InvoiceListItem模型是一个字符串。我不认为它也应该是stringBuilder,因为我只想显示此视图的消息。我不会给它添加任何内容。即使在我的编辑中,我也会接受一个字符串,只需执行以下操作:AdjustmentNotes.AppendLine(model.AdjustmentNotes)@埃克。我可以删除该行,但不会得到错误。但是我将如何显示这些信息呢?我是否应该绕道直接从数据库中获取它并将其放入ViewBag?我认为这不是使用StringBuilder的合适方法。我希望能够轻松地将新的注释行添加到以前的注释中。我决定只为notes创建一个新类,而invoices可以将notes列表作为属性。note类由主题、日期和内容组成。谢谢大家
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()
        }
    );