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中运行,这意味着你的字典代码运行正常.