以下代码适用于IQueryable
类型的集合:
Expression<Func<Activity, bool>> filter = e => e.IsDeleted && e.CategoryId == 1;
但是这个表达式不适用于IEnumerable
类型的集合。
我如何修改表达式以使其正常工作?
在我的实际场景中,我的集合对象是实体框架模型类的导航属性:person.Activities.Where(filter);
这些是错误:
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
答案 0 :(得分:10)
我如何修改表达式以使其正常工作?
只需使用委托而不是表达式树:
Func<Activity, bool> filter = e => e.IsDeleted && e.CategoryId == 1;
如果 开始使用表达式树,您可以将其编译为委托:
var filterDelegate = filterExpressionTree.Compile();
或使用AsQueryable
将IEnumerable<T>
转换为IQueryable<T>
:
var foo = person.Activies.AsQueryable().Where(filterExpressionTree);
我个人会避免使用表达式树,除非你确实需要使用它们。