【问题标题】:How to do an "in" query in entity framework?如何在实体框架中进行“in”查询?
【发布时间】:2009-07-16 14:16:42
【问题描述】:

如何在 linq 中对实体进行选择以从列表中选择带有键的行?像这样的:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (order.Key in orderKeys) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

我尝试使用一些答案中提到的 Contains 方法,但它不起作用并抛出此异常:

LINQ to Entities 无法识别方法 'Boolean Contains[Int32](System.Collections.Generic.IEnumerable`1[System.Int32], Int32)' 方法,并且此方法无法转换为存储表达。

【问题讨论】:

标签: c# .net linq entity-framework


【解决方案1】:

试试这个:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where orderKeys.Contains(order.Key);
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

编辑:我找到了一些解决此问题的方法 - 请参阅WHERE IN clause?

实体框架不 目前支持收藏价值 参数('statusesToFind' 在你 例子)。要解决此问题 限制,您可以手动 构造一个给定 a 的表达式 使用以下值的序列 实用方法:

【讨论】:

  • 如果我对字符串值这样做,那么 EF 会生成不带参数的查询,它只是将字符串值放入查询中
  • 看起来他们增加了对“包含”的支持。在共享链接中,搜索 Zeeshan Hirani 的帖子..
【解决方案2】:

我遇到了同样的问题,我就这样解决了

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (orderKeys.Contains(order.Key)) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

【讨论】:

  • 这个答案对于实体框架 4 是正确的,它是与 .net 4 一起发布的 - 在这种情况下,EF 4 被扩展以执行 WHERE IN - 不是一直到那里,而是更接近
【解决方案3】:

很遗憾,EF 无法翻译其他人建议的查询。因此,虽然这些查询可以在 LINQ to Objects 中工作,但它们不会在 LINQ to Entities 中工作。

所以解决方案有点复杂。

但是我有一篇关于这个确切主题的博客文章here。本质上,解决方案是使用一个小的表达式树魔法来构建一个大的 OR 表达式。

希望对你有帮助

亚历克斯

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多