如何在实体框架中进行"in"查询?

Not*_*Dan 49 .net c# linq entity-framework

如何在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);
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*are 42

试试这个:

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

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

实体框架目前不支持集合值参数(在您的示例中为"statusesToFind").要解决此限制,可以使用以下实用程序方法手动构造给定值序列的表达式:


eka*_*808 21

我有同样的问题,我这样解决了

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

  • 这个答案对于实体框架4来说是正确的,它是用.net 4发布的 - 在这种情况下,EF 4被扩展为执行WHERE IN - 不是所有的方式,但更接近 (5认同)

Ale*_*mes 7

不幸的是,EF无法翻译其他人建议的查询.因此,虽然这些查询可以在LINQ to Objects中使用,但它们在LINQ to Entities中不起作用.

所以解决方案涉及的更多一点.

不过,我在这里有关于这个确切主题的博客文章.本质上,解决方案是使用一点表达式树魔术来构建一个大的OR表达式.

希望这可以帮助

亚历克斯