使用具有LINQ查询的表达式类

时间:2016-03-31 03:39:35

标签: c# entity-framework linq

我想知道是否有一种方法可以将Expression类用于LINQ查询等自定义查询

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1

var items = from item in context.TEntity
where expression
select item

我知道有一种方法可以使用LINQ函数来实现这一点,因为Where函数将表达式作为参数,但我真的需要使用LINQ查询来执行此操作

注意:上面的代码只是一个示例,可以帮助您解决我尝试做的事情并不是实际的工作代码

注意2:我需要使用它来使用Entity Framework

2 个答案:

答案 0 :(得分:3)

不幸的是,实体框架本身不支持这种类型的表达式投影,这就是where expression.Compile().Invoke(item);这样的常见尝试会在运行时抛出异常的原因。

但是,如果您使用LinqKit库(使用Expression Visitor)并在实体集上调用.AsExpandable(),则可以动态调用表达式:

Expression<Func<TEntity, bool>> expression = x => x.Id == 1;

var items = from item in context.Set<TEntity>.AsExpandable()
where expression.Invoke(item)
select item;

答案 1 :(得分:1)

这很有用,至少在EF Core上(我刚刚测试过它)。在我可以测试的地方没有任何EF6项目。

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1

var items = from item in context.TEntity
where expression.Compile()(item);
select item

更新: 我刚刚在EF6上制作了一个简单的测试项目,它在那里不起作用,因为它无法识别表达式调用