2017-12-15 11 views
1

私はデータベースに複数のフィールドを収集した後、合計を送信したいと思います。 しかし、フィールドを文字列として書く必要があります。 私は私の問題を完全に説明することができないかもしれません、私はそれを例示しようとします。Linq dynamic Sum

私がやりたいことは、私がやりたい

このコードのラムダ状態である:

expression = x => x.M1_TotalLoss + x.M2_TotalLoss; 

マイコード:

var param = Expression.Parameter(typeof(FooDomain), "x"); 
var value = Expression.Property(param, ("M1_TotalLoss"+"M2_TotalLoss")); 

var rest = Expression.Lambda<Func<FooDomain, double>>(value, param); 

var result = myContext.FooDomain(). 
       GroupBy(gp=>gp.Year). 
       Select(s => new 
       { 
        TotalLoss = Math.Round(s.AsQueryable().Sum(rest), 2) 
       }). 
       OrderByDescending(o => o.TotalLoss). 
       ToList(); 

しかし、私は書くことができないので、述語が正しく、次のエラーが表示されます。

exceptionMessage =例 'M1_TotalLossM2_TotalLoss'が 'FooDomain'タイプに対して定義されていません。

答えて

2

私たちがここに持っているか見てみましょう:

x => x.M1_TotalLoss + x.M2_TotalLoss 

xは明らかにそう

var param = Expression.Parameter(typeof(FooDomain), "x"); 

はokです、パラメータです。

var value1 = Expression.Property(param, "M1_TotalLoss"); 
var value2 = Expression.Property(param, "M2_TotalLoss"); 

x.M1_TotalLoss + x.M2_TotalLossはちょうどが2の操作を追加することです:

x.M1_TotalLossx.M2_TotalLossのでそれを反映させ、プロパティそれぞれ"M1_TotalLoss""M2_TotalLoss"と呼ばれるパラメータのxです

var value = Expression.Add(value1, value2); 

あなたは完了です - 残りのコードはOKです。

2つ以上のプロパティについてはどうなりますか? op1 + op2 + op3ので

は、(op1 + op2) + op3と同等であり、又は方法表記Add(Add(op1, op2), op3)と、Nの添加は、以前のオペランドの加算の結果を次のオペランドを追加として再帰的に記述することができることが分かります。 LINQ Aggregateメソッドで簡単に実装できます。

ので、所望の特性名を含むIEnumerable<string>、あなたはこのようなものを使用することができます与えられた:

var propertyNames = new [] { "M1_TotalLoss", "M2_TotalLoss", }; 

var param = Expression.Parameter(typeof(FooDomain), "x"); 
var value = propertyNames.Select(name => Expression.Property(param, name)) 
    .Aggregate<Expression>(Expression.Add); 

// the rest of the code (same as yours) 
+0

を実際に、それは簡単なquestion.Iだった私は私の質問に答えるために来ている をexpression.add表示されませんでしたそれから私はあなたがアンサーとして行ったあなたの答えを見た。どうもありがとう –

関連する問題