创建具有 3 个条件的 Lambda 表达式

Ari*_*ian 1 c# linq lambda expression-trees c#-4.0

我想为此动态创建一个 lambda 表达式:

(o => o.Year == year && o.CityCode == cityCode && o.Status == status)
Run Code Online (Sandbox Code Playgroud)

我这样写:

var body = Expression.AndAlso(
               Expression.Equal(
                    Expression.PropertyOrField(param, "Year"),
                    Expression.Constant(year)
               ),
               Expression.Equal(
                    Expression.PropertyOrField(param, "CityCode"),
                    Expression.Constant(cityCode)
               )
               ,
               Expression.Equal(
                    Expression.PropertyOrField(param, "Status"),
                    Expression.Constant(status)
               )
           );
Run Code Online (Sandbox Code Playgroud)

但对于这段代码:

Expression.Equal(
                    Expression.PropertyOrField(param, "Status"),
                    Expression.Constant(status)
                )
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

无法从“System.Linq.Expressions.BinaryExpression”转换为“System.Reflection.MethodInfo”

如何向 lambda 表达式添加 3 个条件?

Jon*_*nna 5

Expression.AndAlso需要两个表达式。有一个需要三个参数的重载,但第三个参数是对两个操作数实现andMethodInfo运算的方法(在这种情况下还有进一步的限制,因为它不允许覆盖真实性的细节,因此第一个操作数仍然需要有一个and运算符或者可以转换为)。AndAlsotruefalsebool

所以你想要的相当于:

(o => o.Year == year && (o.CityCode == cityCode && o.Status == status))
Run Code Online (Sandbox Code Playgroud)

这将是:

var body = Expression.AndAlso(
    Expression.Equal(
        Expression.PropertyOrField(param, "Year"),
        Expression.Constant(year)
    ),
    Expression.AndAlso(
        Expression.Equal(
            Expression.PropertyOrField(param, "CityCode"),
            Expression.Constant(cityCode)
        ),
        Expression.Equal(
            Expression.PropertyOrField(param, "Status"),
            Expression.Constant(status)
        )
    )
);
Run Code Online (Sandbox Code Playgroud)