【问题标题】:String.Format or toString not allowed in linqlinq 中不允许使用 String.Format 或 toString
【发布时间】:2017-01-18 13:03:47
【问题描述】:

下面的代码不喜欢并抛出以下错误。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 你也可以添加一个理由吗?我的意思是为什么我们需要.AsEnumerable()
    • 是的,这背后的原因是什么。它有效,如果您要格式化属性,我只是不明白类型有什么问题。
    • String.Format 在 EF 尝试运行查询以获取数据时无法转换为有效的 SQL 表达式。见What is the effect of AsEnumerable() on a LINQ Entity?。当您开始枚举结果时,它会获取(原始数据)并且可以在内存中完成字符串操作。
    • Raw data 表示它会检索ShippingMethods 表的all the columns 吗?如果Yes 那么它是 HORRIBLE 否(即性能方面)? @Shyju
    • 您可以运行 SQL 分析器来查看执行该代码时会发生什么。如果您只需要几列,您可以先调用Select,然后再调用AsEnumerable
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      AsEnumerable()

      将每条记录加载application memory,然后执行filtering 等(例如Where/Take/Skip)。它将select * from MyTable, into thememory, then select thefirst 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();
      

      【讨论】:

      • 这段代码甚至无法编译!在你的第二个 Select y 代表一个 SelectListItem 它没有 CostName 属性。更改属性名称甚至更好,首先选择.Select(x => new { Name = x.Name, Cost = x.Cost}).AsEnumerable()
      • 啊哈...非常感谢 :D 完成了。希望现在一切都好,不是吗? @Shyju
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多