【问题标题】:linq to entity framework: use dictionary in querylinq to entity framework:在查询中使用字典
【发布时间】:2011-10-03 18:06:22
【问题描述】:

我有:

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 的限制还是我遗漏了什么?

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    这是实体框架的本质——当您将表达式放入查询中时,它会尽力将它们翻译成 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,这意味着您的字典代码可以正常运行。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多