【问题标题】:Linq/lambda toDictionary() throwing exceptionLinq/lambda toDictionary() 抛出异常
【发布时间】:2017-03-03 21:43:16
【问题描述】:

我有一个类似这样的查询

return (from item in context.MERCHANDISE_ITEMS
        where item.ORGID == orgId
        select new MerchandiseModel()
        {
            Description = item.DESCRIPTION,
            ...,
            Images = context.MERCHANDISE_IMAGES.Where(i => i.ITEMID == item.ID).ToDictionary(i => i.ID, i => i.IMAGENAME)
        }).FirstOrDefault();

Images 是字典,MERCHANDISE_IMAGES.ID 是 int,MERCHANDISE_IMAGES.IMAGENAME 是字符串。

这是抛出 System.NotSupportedException,我试过做 linq(没有 lambda),同样的异常。

这是一个例外:

LINQ to Entities does not recognize the method
 'System.Collections.Generic.Dictionary`2[System.Int32,System.String] ToDictionary[MERCHANDISE_IMAGES,Int32,String](System.Collections.Generic.IEnumerable`1[Hylton.Infrastructure.EntityFrameworkORM.MERCHANDISE_IMAGES], 
System.Func`2[Hylton.Infrastructure.EntityFrameworkORM.MERCHANDISE_IMAGES,
System.Int32], System.Func`2[Hylton.Infrastructure.EntityFrameworkORM.MERCHANDISE_IMAGES,System.String])' method,
and this method cannot be translated into a store expression.

我不知道我做错了什么,我浏览了有关此问题的所有帖子,并且我所看到的一切都是以同样的方式做的。谁能指出我错过了什么?

【问题讨论】:

  • 错误消息似乎很容易解释。查询提供程序无法将ToDictionary 转换为 SQL 代码,因此它会引发异常。您希望将其翻译成什么 SQL?
  • 说实话我不确定。我已经看到过这种语法,但在那些情况下,它可能不是真正的 SQL 查询。所以我猜没有办法做到这一点?
  • 了解发生了什么。当您执行“context.MERCHANDISE_IMAGES.Where(i => i.ITEMID == item.ID).ToDictionary(i => i.ID, i => i.IMAGENAME)”时,您要求框架将“ ToDictionary”方法导入 SQL。它不知道该怎么做。这就是它破裂的原因。在我看来,您的模型属性应该是不同的类型(如 IEnumerable)或单独加载。
  • 您应该编写 EF 查询以实际执行所需的数据库查询,然后在编写所需的 EF 查询后,您可以编写一个查询以在您的实际应用程序代码中执行任何操作你不能在数据库中做。
  • 是的,我明白了。非常感谢。就像我说的那样,我不太明白说什么例外……尽管当你说出来时它是完全有道理的。我所做的是制作一个具有 int 和 string 属性的模型,所以现在 Images 是 List 并且可以工作。我太新了,无法投票给你,但非常感谢!

标签: c# asp.net-mvc linq exception lambda


【解决方案1】:

短版:EF 无法将 ToDictionary 转换为 SQL。

根据我的经验,最好的方法是将 Select 简化为匿名类型,其中包含您需要的 DBO 中的所有内容,调用 ToList(或其他强制评估的方法),然后执行 ToDictionary 和其他按摩数据。

这样做的额外好处是通过强制它进行评估,您将避免离开使用您的上下文并关闭它,这将在您尝试使用返回时导致错误。

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 2014-10-19
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2018-10-17
    相关资源
    最近更新 更多