【问题标题】:I am unable to convert StringBuilder to string in c# asp.net MVC我无法在 c#asp.net MVC 中将 StringBuilder 转换为字符串
【发布时间】:2021-05-02 05:14:10
【问题描述】:

我的发票类有一个StringBuilder 属性,因此如果进行了调整,用户会添加注释作为调整原因的详细信息。此属性在创建时设置为新的空 StringBuilder。只有在编辑模式下才会添加.Append()。据我了解,这比每次添加新注释时都使用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; }
}

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

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: 'StringBuilder' 类型的值无法转换为字符串。'

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

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

编辑:为澄清起见,这是我的InvoiceListItem 模型类:

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; }
}

【问题讨论】:

  • 一般来说,您不需要在模型中使用 stringbuilder,而是需要字符串,只需根据需要使用 stringbuilder 来构建您的字符串。它更像是一个临时类,可以帮助您有效地处理字符串。但从根本上说,它只会产生一个字符串
  • 如果删除 `AdjustmentNotes = e.AdjustmentNotes.ToString()` 行会发生什么?还会扔吗?
  • @Jawad 我的 AdjustmentNotes 的 InvoiceListItem 模型是一个字符串。我不认为它也应该是一个 stringBuilder 因为我只想显示这个视图的消息。我不会添加任何东西。即使在我的编辑中,我也会输入一个字符串并执行:AdjustmentNotes.AppendLine(model.AdjustmentNotes);
  • @ekke。我可以删除该行并且我没有收到错误。但是,我将如何显示该信息?我是不是应该绕个弯,直接从数据库中抓取,扔到ViewBag里??
  • 我认为这不是使用 StringBuilder 的合适方式。我希望能够轻松地将新的注释行添加到以前的注释中。我决定只为便笺创建一个新类,并且发票可以将便笺列表作为属性。笔记类将由主题、日期和内容组成。谢谢大家

标签: c# asp.net-mvc entity-framework linq razor


【解决方案1】:

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()
        }
    );

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

如果有支持,它似乎非常有限(请参阅您问题中的错误)。也许您可以考虑在实体类中使用String 而不是StringBuilder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2014-10-26
    • 2022-08-23
    相关资源
    最近更新 更多