我无法在c#asp.net MVC中将StringBuilder转换为字符串
My invoice类有一个我无法在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; }
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()
}
);