将编译后的表达式传递给where()子句

时间:2014-11-17 15:42:38

标签: c# asp.net entity-framework

我在EF对象上使用的计算属性无法直接传递给where()子句:

{"The specified type member 'SomeProp' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}

根据我在SO上阅读的内容,可以通过将Expression<Func<T, bool>>作为参数传递给where()来避免这种情况。

将表达式编译为Func可以正常工作:

Expression<Func<Foo, bool>> expr = e => f => f.SomeCalculatedProperty == 1;
Func<Foo, bool> compiled = expr.Compile();
Foo result = dbContext.Foo.Where(compiled);

但是通过表达式会给我上面的错误,即:

Expression<Func<Foo, bool>> expr = e => f => f.SomeCalculatedProperty == 1;
Foo result = dbContext.Foo.Where(e);

基于this,最后一个例子不应该正常吗?

1 个答案:

答案 0 :(得分:0)

在示例一中,您正在调用扩展方法Queryable.Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate),这会将查询转换为sql并应用过滤器服务器端。

在示例2中,您正在调用扩展方法Enumerable.Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate),这将返回数据库中的所有行,然后在应用过滤器的程序的内存中返回。

对于你的第三个例子,我将引用Servy's comment

  

您的第一个和第三个代码段在功能上完全相同。必有   有些不同,你没有表现出一个工作和另一个   没有。