2017-09-04 39 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) 
     ) 
    ) 
);