Where()的IEnumerable lambda表达式

时间:2013-04-16 19:12:21

标签: c# linq expression ienumerable iqueryable

以下代码适用于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

1 个答案:

答案 0 :(得分:10)

  

我如何修改表达式以使其正常工作?

只需使用委托而不是表达式树:

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

如果 开始使用表达式树,您可以将其编译为委托:

var filterDelegate = filterExpressionTree.Compile();

或使用AsQueryableIEnumerable<T>转换为IQueryable<T>

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

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