Linq / lambda toDictionary()抛出异常

时间:2017-03-03 21:43:17

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

我的查询看起来像这样

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

图片是字典,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.

我不知道我做错了什么,我已经查看了这个问题的每一篇文章,我看到的一切都是以同样的方式做到的。任何人都可以指出我缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

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

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

这样做的另一个好处是强制它进行评估,你将避免让你的上下文使用并关闭它,这会在你尝试使用返回时导致错误。