How to do an "in" query in entity framework?

C#.NetLinqEntity Framework

C# Problem Overview


How can I do a select in linq to entities to select rows with keys from a list? Something like this:

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);

I tried using the Contains method as mentioned in some of the answers but it does not work and throws this exception:

LINQ to Entities does not recognize the method 'Boolean Contains[Int32](System.Collections.Generic.IEnumerable`1[System.Int32], Int32)' method, and this method cannot be translated into a store expression.

C# Solutions


Solution 1 - C#

Try this:

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);

Edit: I have found some workarounds for this issue - please see WHERE IN clause?:

> The Entity Framework does not > currently support collection-valued > parameters ('statusesToFind' in your > example). To work around this > restriction, you can manually > construct an expression given a > sequence of values using the following > utility method:

Solution 2 - C#

I had the same problem and i solved like this

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);

Solution 3 - C#

Unfortunately the EF can't translate the queries others have suggested. So while those queries would work in LINQ to Objects, they won't work in LINQ to Entities.

So the solution is a little more involved.

However I have a blog post on this exact topic here. Essentially the solution is to use a little expression tree magic to build an big OR expression.

Hope this helps

Alex

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNotDanView Question on Stackoverflow
Solution 1 - C#Andrew HareView Answer on Stackoverflow
Solution 2 - C#eka808View Answer on Stackoverflow
Solution 3 - C#Alex JamesView Answer on Stackoverflow