linq to entity framework:在查询中使用字典

时间:2011-10-03 18:06:22

标签: linq entity-framework

我有:

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的这种限制还是我错过了什么?

1 个答案:

答案 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,这意味着您的字典代码可以正常运行。