3

以下代码适用于类型的集合IQueryable

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

但是这个表达式不适用于 type 的集合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
4

1 回答 1

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);

除非您确实需要使用它们,否则我个人会避免使用表达式树。

于 2013-04-16T19:14:38.000 回答