我想知道是否有一种方法可以将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
答案 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上制作了一个简单的测试项目,它在那里不起作用,因为它无法识别表达式调用