2017-09-04 42 views
1

我要动态地创建一个lambda表达式是:创建Lambda表达式有了3个条件

(o => o.Year == year && o.CityCode == cityCode && o.Status == status) 

,我这样写:

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

但对于这个区块的代码:

Expression.Equal(
        Expression.PropertyOrField(param, "Status"), 
        Expression.Constant(status) 
       ) 

我得到一个错误:

Cannot convert from 'System.Linq.Expressions.BinaryExpression' to 'System.Reflection.MethodInfo'

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

+0

是什么'Status'? –

+0

@MongZhu我更新问答。请再看一遍 – Arian

+8

'AndAlso'是一个'BinaryExpression',即有2个操作数。如果你有2个以上,你必须链接多个'AndAlso',即'AndAlso(AndAlso(op1,op2),op3)'等。 –

回答

2

Expression.AndAlso有两个表达式。有一个重载需要三个参数,但第三个参数是对两个操作数执行操作的方法的MethodInfo(在AndAlso的情况下存在进一步的限制,因为它不允许详细的真实性被覆盖,所以第一个操作数将仍然需要有一个truefalse运算符或者可铸造到bool)。

所以,你想要的是等价的:

(o => o.Year == year && (o.CityCode == cityCode && o.Status == status)) 

具体做法是:

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