我有两个表达式,分别在不同的时间建立,但需要合并才能正确地“分组”where子句。我尝试过这个选项,但我正在使用Entity Framework,它不理解
如果有人能指引我正确的方向,我会非常感激,感觉就快成功了。
第一个Where子句 (对象类型为
如果有人能帮我合并Where Clause 1A和Where Clause 1B,我将非常感谢。
只是提醒一下,Where()和Any()子句是从IQueryable获得的通用方法,不确定是否重要。
Invoke
函数。我看到了一些ExpressionVisitor
的替代方案,但我认为我对需要做什么没有足够的理解。如果有人能指引我正确的方向,我会非常感激,感觉就快成功了。
第一个Where子句 (对象类型为
Expression<Func<T, bool>>
):{parm => parm.Name.Contains("hat")}
Where Clause 1B (对象类型为LambdaExpression
,但可以使用(Expression<Func<T, bool>>)LambdaExpression
) )
{parm => parm.Attributes.Any(parm => ((parm.Name == "test") AndAlso (parm.Value == "21")))}
需要的Where子句
{parm =>
parm.Name.Contains("hat") (&&/||)
parm.Attributes.Any(parm => ((parm.Name == "test") AndAlso (parm.Value == "21")))
}
如果有人能帮我合并Where Clause 1A和Where Clause 1B,我将非常感谢。
只是提醒一下,Where()和Any()子句是从IQueryable获得的通用方法,不确定是否重要。
Func<MethodInfo, bool> methodLambda = m => m.Name == "Any" && m.GetParameters().Length == 2;
MethodInfo method = typeof(Queryable).GetMethods().Where(methodLambda).Single().MakeGenericMethod(ActualQueryableType);
ParameterExpression parentMember = Expression.Parameter(typeof(T), "parentParm");
// Create Any() Expression tree and convert it to lambda
MethodCallExpression callAny = Expression.Call(method, member, exp);
LambdaExpression lambdaAny = Expression.Lambda(callAny, param);
var combExp = parentExp.And((Expression<Func<T, bool>>)lambdaAny);
MethodCallExpression whereCall = Expression.Call(typeof(Queryable), "Where", new Type[] { query.ElementType }, new Expression[] {
query.Expression,
Expression.Quote(combExp)
});
query = (IQueryable<T>)query.Provider.CreateQuery(whereCall);
使用Invoke
时出现的错误是:
NotSupportedException
在实体框架中,不支持LINQ表达式节点类型“Invoke”。
Invoke
的异常是什么吗? - MarcinJuraszekExpression.Invoke
,我在想OP是否正在使用Func.Invoke
,我相当确定这会失败。 - MarcinJuraszek