【发布时间】:2019-01-11 13:18:44
【问题描述】:
我需要根据现有 IQueryable 对象的某些条件,在 where 子句中动态添加“Or”子句。
使用 ExpressionBuilder,我可以组成一个左右表达式>,但要做到这一点,我需要从我的 IQueryable 实例中提取 Expression>。 有可能吗?
示例代码:
var list = _context.Set<T>().Where(x=>x.Id == 1);
if(someValue)
{
var leftExpression = list.???? //I would extract the Expression<Func<T, bool>> here
var orExpression = (T x) => x.Status == 1;
var newWhereClause = ExpressionBuilder.Or(leftExpression, orExpression);
list = list.Where(newWhereClause);
}
ExpressionBuilder 代码取自此链接: https://blogs.msdn.microsoft.com/meek/2008/05/02/linq-to-entities-combining-predicates/
谢谢!
【问题讨论】:
-
list.Expression给你什么? -
一个表达式对象,但不是一个表达式
> -
试试这个:
((UnaryExpression)((MethodCallExpression)q.Expression).Arguments[1]).Operand. -
不知道我能用这个做什么。它给了我一个 UnaryExpression 是的,但是,我怎样才能从中得到一个 Expression
> ? -
实际上,
Arguments[1].Operand是Expression<Func<T,bool>>- 您必须转换为UnaryExpression才能获得Arguments字段。 LINQPad 和它的Dump方法对此很有帮助,C# Reference Source 也是如此。
标签: linq lambda entity-framework-6 expression-trees