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

ren*_*ren 6 linq entity-framework

我有:

Dictionary<int, List<int>> dict = new ...
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 
Run Code Online (Sandbox Code Playgroud)

这会产生错误

 LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method
Run Code Online (Sandbox Code Playgroud)

与列表一起工作:

List<int> l = new ...
var a = SomeEntity.Where(f => l.Contains(f.someValue))
Run Code Online (Sandbox Code Playgroud)

因此linq对EF的这种限制还是我错过了什么?

Joe*_*nos 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));
Run Code Online (Sandbox Code Playgroud)

ToArray()方法将整个结果集拉入内存(还有其他方法可以做到这一点,但这就是我通常的做法),以下Where子句在LINQ-to-objects而不是LINQ-to-Entities中运行,这意味着你的字典代码运行正常.