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

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

谢谢

最佳答案

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

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

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

在短期内,您可能会通过一些更简单的事情来解决问题:一个基本表达式列表和一个 bool 标志来说明它们是否应该与 && 或 || 组合。

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

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

关于c# - 运行时 C# 中 Lambda 表达式中的多个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486879/

相关文章:

c# - 映射到 SQL Server 列时如何在 EF Core 3.0 中创建 OwnsOne 属性?

lambda - 统计一个字母在列表中出现的次数

python - 如何在 Python 2.7 中创建 Lambda 函数来创建、重新启动、删除、修改 ElastiCache Redis?

Python lambda 绑定(bind)到本地值

c# - 多个 Moq It.Is<string>() 匹配参数

c# - 长整数文字

c# - 返回值表示无效值

java - 选择列表的元素直到满足 Java 8 Lambdas 的条件

lambda - 使用 gdb 调试 lambdas 有什么好运气吗?

c# - 使用 JSON.NET 序列化对象时如何添加自定义根节点?