Lambda表达式在运行时C#中的多个条件

时间:2010-03-21 11:30:59

标签: c# lambda

我想知道如何通过输入多个参数

来创建表达式树

示例:

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();
    }

由于

1 个答案:

答案 0 :(得分:2)

Expression.And在这里使用是错误的,它是按位和。你想要AndAlso

除了您之外,您似乎已经了解了如何构建表达式树的机制。所以你真正想问的是如何让建筑方法的调用者指定一种更复杂,更灵活的方法来组合不同的条件。

最终,要获得真正的灵活性,您需要一种迷你查询语言。解析语言以构建表达式树。

在短期内,你可能会用更简单的东西:一个原始表达列表和一个bool标志来说明它们是否应该与&amp;&amp;和或||。

更新 - 我注意到你实际上正在将结果表达式编译成真正的委托。这让我想知道你为什么一开始就这么做。为什么不把表达式写成lambda,就像在最初的例子中一样? (如果你使用Linq to SQL或EF,你不应该编译表达式。)

更新2 - 您可能需要的是Dynamic Linq