字符串.linq中不允许使用Format或toString

本文关键字:Format toString linq 不允许 字符串 | 更新日期: 2023-09-27 18:06:32

下面的代码不受欢迎,并抛出以下错误:

LINQ to Entities不能识别方法System。字符串格式(系统。字符串,System.Object)'方法,并且该方法不能转换为存储表达式。

在我将运输方法的成本从十进制更改之前,我以前能够做到这一点吗?小数。我把它改成小数,然后它开始抛出错误,然后我把它改回来,现在它还是不像这样。这里做错了什么?我只是试图使文本的航运方法的名称与-和成本作为文本的连接。

  var ShippingMethods = db.ShippingMethods.Select(x => new SelectListItem()
                    {
                        Text = x.Name + " - " + String.Format("c", x.Cost),
                        Value = x.Cost.ToString()
                    }).ToList();

字符串.linq中不允许使用Format或toString

你必须使用。asenumerable(),你可以从here找到原因

 db.ShippingMethods.AsEnumerable().Select(x => new SelectListItem()
                    {
                        Text = x.Name + " - " + String.Format("c", x.Cost),
                        Value = x.Cost.ToString()
                    }).ToList();

如果您考虑性能,那么您可以如下所示使用它。因为如果我们从db检索与ShippingMethods表相关的所有行数据,然后在内存上执行projection(在.AsEnumerable()之后)意味着它会严重降低性能。下面的查询适合考虑EF查询性能的开发人员。

AsEnumerable ()

加载每个记录application memory,然后执行filtering等(例如Where/Take/Skip)。它将select * from MyTable, into the内存, then select the前X个元素'。

db.ShippingMethods.Select(x => new 
                    {
                        Name = x.Name,
                        Cost = x.Cost,
                    }).AsEnumerable().Select(y => new SelectListItem()
                    {
                        Text = y.Name + " - " + String.Format("c", y.Cost),
                        Value = y.Cost.ToString()
                    }).ToList();

调用AsEnumerable(或ToList或ToArray)将把dbset的内容拉到内存中,在那里可以对它们执行任何类型的操作。关于转换成存储表达式的消息意味着linq提供程序不能转换String。将其格式化为SQL并在数据库级运行。

在这种情况下,在dbset上调用AsEnumerable可能很好,但是在您不想将整个表拉入内存的情况下,您将过滤它,然后列出它,然后用select转换它。