linq中不允许使用String.Format或toString

时间:2016-09-10 15:19:53

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

以下代码不受欢迎,并抛出以下错误。

  

LINQ to Entities无法识别方法' System.String Format(System.String,System.Object)'方法,并且此方法无法转换为商店表达式。

在我从十进制更改送货方式的费用之前,我之前能够这样做吗?到十进制。我把它改为十进制,它开始抛出一个错误,然后我把它改回来,现在它仍然不喜欢这个。这里做错了什么。我只是试图将文本与运输方法的名称串联起来,并将成本作为文本。

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

3 个答案:

答案 0 :(得分:3)

您必须使用.AsEnumerable()以及here

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

答案 1 :(得分:2)

如果您考虑效果,那么您可以使用它,如下所示.B' cos,如果我们从{{1}检索与ShippingMethods表相关的所有行数据然后对内存执行db(在projection之后)意味着它会严重降低性能。下方查询适用于考虑EF查询性能的开发人员。

<强> AsEnumerable()

将每条记录加载到.AsEnumerable(),然后执行application memory等等(例如filtering)。它将Where/Take/Skip内存{ {1}}第一个X元素。

select * from MyTable, into the

答案 2 :(得分:0)

调用AsEnumerable(或ToList或ToArray)将dbset的内容拉入内存,在内存中可以对它们执行任何类型的操作。有关转换为存储表达式的消息意味着linq提供程序无法将String.Format转换为SQL并在数据库级别运行它。

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