我无法在 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
我的发票 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