我想知道如何通过输入多个参数来制作表达式树
例子:
dataContext.Users.Where(u => u.username == "Username" && u.password == "Password")
目前,我执行的代码如下,但希望在条件为OR或AND方面更笼统
public Func<TLinqEntity, bool> ANDOnlyParams(string[] paramNames, object[] values)
{
List<ParameterExpression> paramList = new List<ParameterExpression>();
foreach (string param in paramNames)
{
paramList.Add(Expression.Parameter(typeof(TLinqEntity), param));
}
List<LambdaExpression> lexList = new List<LambdaExpression>();
for (int i = 0; i < paramNames.Length; i++)
{
if (i == 0)
{
Expression bodyInner = Expression.Equal(
Expression.Property(
paramList[i], paramNames[i]),
Expression.Constant(values[i]));
lexList.Add(Expression.Lambda(bodyInner, paramList[i]));
}
else
{
Expression bodyOuter = Expression.And(
Expression.Equal(
Expression.Property(
paramList[i], paramNames[i]),
Expression.Constant(values[i])),
Expression.Invoke(lexList[i - 1], paramList[i]));
lexList.Add(Expression.Lambda(bodyOuter, paramList[i]));
}
}
return ((Expression<Func<TLinqEntity, bool>>)lexList[lexList.Count - 1]).Compile();
}
谢谢
最佳答案
Expression.And
在这里使用是错误的事情,它是按位的。您需要AndAlso
。
除了您之外,您似乎已经知道如何构建表达式树的机制。因此,您真正要问的是如何让构建方法的调用者指定一种更复杂,更灵活的组合不同条件的方式。
最终,要获得真正的灵活性,您需要一种小型查询语言。解析语言以构建表达式树。
在短期内,您可能会遇到一些更简单的事情:原始表达式的列表和bool标志,用于说明是否应将它们与&&或||组合使用。
更新-我注意到您实际上是在将结果表达式编译成一个真正的委托(delegate)。这使我想知道为什么您首先要这样做很困难。为什么不像最初的示例那样仅将表达式写为lambda? (如果您使用的是Linq to SQL或EF,则无论如何都不应该编译该表达式。)
更新2-您可能需要的是Dynamic Linq。
关于c# - Lambda表达式在运行时C#的多个条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2486879/