Passing filtering functions to Where() in LINQ-to-SQL
- by Daniel
I'm trying to write a set of filtering functions that can be chained together to progressively filter a data set. What's tricky about this is that I want to be able to define the filters in a different context from that in which they'll be used. I've gotten as far as being able to pass a very basic function to the Where() clause in a LINQ statement:
filters file:
Func<item, bool> returnTrue = (i) => true;
repository file:
public IQueryable<item> getItems()
{
return DataContext.Items.Where(returnTrue);
}
This works. However, as soon as I try to use more complicated logic, the trouble begins:
filters file:
Func<item, bool> isAssignedToUser = (i) => i.assignedUserId == userId;
repository file:
public IQueryable<item> getItemsAssignedToUser(int userId)
{
return DataContext.Items.Where(isAssignedToUser);
}
This won't even build because userId isn't in the same scope as isAssignedToUser(). I've also tried declaring a function that takes the userId as a parameter:
Func<item, int, bool> isAssignedToUser = (i, userId) => i.assignedUserId == userId;
The problem with this is that it doesn't fit the function signature that Where() is expecting:
Func<item, bool>
There must be a way to do this, but I'm at a loss for how. I don't feel like I'm explaining this very well, but hopefully you get the gist.
Thanks,
Daniel