【问题标题】:Multiple Conditions in Lambda Expressions at runtime C#运行时 C# 中的 Lambda 表达式中的多个条件
【发布时间】:2010-03-21 20:48:08
【问题描述】:

我想知道如何通过输入多个参数来制作表达式树

例子:

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

谢谢

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

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

    您似乎已经知道如何构建表达式树的机制。所以你真正要问的是如何让你的构建方法的调用者指定一种更复杂、更灵活的方式来组合不同的条件。

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

    在短期内,您可能会得到一些更简单的东西:一个原始表达式列表和一个布尔标志来说明它们是否应该与 && 或 || 组合。

    更新 - 我注意到您实际上是在将生成的表达式编译成真正的委托。这让我想知道为什么您首先要以艰难的方式这样做。为什么不像你最初的例子那样把表达式写成 lambda? (如果您使用的是 Linq to SQL 或 EF,则无论如何都不应该编译表达式。)

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

    【讨论】:

    • 关于我为什么要采用艰难的方式(返回委托),原因是在设计时无法直接访问数据库列名。而且我无法使用 datacontext.table.Where(...);因为我在数据库中加密了表名。感谢您的回答,我将寻找 AndAlso 方法...
    • @Ryan - 查看更新 - 我记得有这个库!
    • 谢谢丹尼尔...我真的很感激它看起来正是我所需要的:)
    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多