2017-09-04 9 views
1

でラムダ式を作成します。私はこのために動的にラムダ式を作成する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) 
       ) 

エラーが表示されます。

ラムダ式にどのように3つの条件を追加できますか?

+0

、以下のリンクをご参照ください –

+0

@MongZhu I Quesを更新します。もう一度見てください – Arian

+8

'AndAlso'は' BinaryExpression'です。すなわち、2つのオペランドを持っています。 2つ以上の場合、複数の 'AndAlso'、つまり' AndAlso(AndAlso(op1、op2)、op3) 'などを連結しなければなりません。 –

答えて

2

Expression.AndAlsoは2つの式をとります。 3つの引数をとるオーバーロードがありますが、3つ目の引数は、の2つのオペランドに対する演算を実装するメソッドの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) 
     ) 
    ) 
); 
関連する問題