繁体   English   中英

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

[英]String.Format or toString not allowed in linq

以下代码不受欢迎,并引发以下错误。

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

您必须使用.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.Format转换为SQL并在数据库级别运行它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM