I am having trouble being able to replicate multiple .Wheres in my linq query using Expression Trees, I need this query to be dynamic since its a search feature.The database I will be querying eventually will get large so i need to be efficient and cant filter client side. I am at least trying to start by filtering by 3 of these columns. Below I added three of the ids im trying to filter by. I have read alot into expression trees but could use someones help to actually apply them to what im doing because they are confusing me.
public int? heightId { get; set; }
public int? ageId { get; set; }
public int? genderId { get; set; }
Advertisement
Answer
It is not dynamic, because you know the columns in advance. You don’t need to use expression trees as well. You can just apply the filters conditionally:
public Class[] FindByFilter(int limit, int? heightId = null, int? ageId = null, int? genderId = null)
{
var classes = databaseContext.Set<Class>();
if (heightId.HasValue)
classes = classes.Where(c => c.HeightId == heightId.Value);
if (ageId.HasValue)
classes = classes.Where(c => c.AgeId == ageId.Value);
if (heightId.HasValue)
classes = classes.Where(c => c.GenderId == genderId.Value);
return classes.Take(limit).ToArray();
}
So, now FindByFilter(10, 1, null, 2)
or equivalent FindByFilter(10, heightId: 1, genderId: 2)
will return TOP 10 rows with height 1, gender 2, but any age.