我有:
Dictionary<int, List<int>> dict = new ...
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue))
这会产生错误
LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method
与列表一起工作:
List<int> l = new ...
var a = SomeEntity.Where(f => l.Contains(f.someValue))
linq对EF的这种限制还是我错过了什么?
答案 0 :(得分:11)
这是实体框架的本质 - 当您将表达式放入查询时,它会尽力将它们转换为SQL,以便可以在服务器上完成工作。
在您的第一个示例中,它尝试将查询和字典检索调用都转换为SQL,但由于它不知道如何,因此无法进行。
在第二个示例中,您只是将列表传递给查询。它确实知道如何将其转换为SQL。
有一些类似的问题,所以在定义EF查询之前,你必须要注意它。
修改强>
注意到您的第一个查询在从字典中读取时使用了查询结果。因此,您实际上无法将字典传递到SQL查询中,您可能需要先从数据库中检索所有记录,然后使用LINQ-to-objects执行检查,如:
Dictionary<int, List<int>> dict = new ...
var a = SomeEntity
.ToArray()
.Where(f => dict[f.key].Contains(f.someValue));
ToArray()
方法将整个结果集拉入内存(还有其他方法可以实现,但这就是我通常的做法),并且以下Where
子句在LINQ-to中运行-objects而不是LINQ-to-Entities,这意味着您的字典代码可以正常运行。