Felix C
Felix C

Reputation: 1775

IEnumerable lambda expression for Where()

following code works on a collection of type IQueryable:

Expression<Func<Activity, bool>> filter = e => e.IsDeleted && e.CategoryId == 1;

But this expression doesn't work on collections of type IEnumerable.

How I have to modify my expression to get it working?

In my real scenario, my collection object is a navigation property of an entity framework model class: person.Activities.Where(filter);

These are the errors:

Error 1
Instance argument: cannot convert from 'System.Collections.Generic.ICollection<Application.Models.Activity>' to 'System.Linq.IQueryable<Application.Models.Activity>'

Error 2
'System.Collections.Generic.ICollection<Application.Models.Activity>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,bool>>)' has some invalid arguments

Upvotes: 3

Views: 5162

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1500585

How I have to modify my expression to get it working?

Just use a delegate instead of an expression tree:

Func<Activity, bool> filter = e => e.IsDeleted && e.CategoryId == 1;

If you have to start off with an expression tree, you can either compile that to a delegate:

var filterDelegate = filterExpressionTree.Compile();

Or use AsQueryable to convert your IEnumerable<T> to an IQueryable<T>:

var foo = person.Activies.AsQueryable().Where(filterExpressionTree);

I'd personally avoid expression trees unless you actually need to use them though.

Upvotes: 10

Related Questions