clhereistian
clhereistian

Reputation: 1300

Filter DbSet by list of objects

I am using Entity Framework Core with SQL Server to filter a list of division entities by a list of passed in search objects. I want to return division that match the criteria in any one of the search objects. The search object class looks like:

public class SearchObject
{
    public int DivisionId { get; set; }
    public int Status { get; set; }
}

Here is the query I tried:

var searchObjects = new List<SearchObject> { ... };

 IQueryable<Product> query = myContext.Divisions.Where(div =>
     searchObjects.Any(searchObj =>  
            searchObj.Status == div.Status && 
            searchObj.DivisionId == div.DivisionId))
    .Select(...);

When the IQueryable enumerates, I get an error stating: "The Linq Expresion DbSet ... Could not be translated ..." What I need is something like .Contains(), but that works with a list of SearchObj.

Upvotes: 0

Views: 901

Answers (1)

AMunim
AMunim

Reputation: 1181

Well you have the right idea by

What I need is something like .Contains(), but that works with a list of SearchObj.

and this is how you'd do it

var searchObjects = new List<SearchObject> { ... };
var searchIds = searchObjects.Select(x => x.Divisiond) //.ToList() perhaps?
var searchStatus = searchObjects.Select(x => x.Status) //.ToList() perhaps?
//not you can simply use .Contains and it should generate a WHERE EXISTS query

 IQueryable<Product> query = myContext.Divisions
          .Where(div =>
              searchIds.Contains(div.DivisionId) &&
              searchStatus.Contains(div.Status))
    .Select(...);

Upvotes: 1

Related Questions