字符串.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();
你必须使用。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转换它。