2017-12-15 5 views
1

Ich möchte eine Summe senden, nachdem ich mehrere Felder in der Datenbank gesammelt habe. Aber ich muss die Felder als Zeichenfolge schreiben. Ich bin vielleicht nicht in der Lage, mein Problem vollständig zu erklären, ich werde versuchen, es zu veranschaulichen.Linq dynamische Summe

Was möchte ich tun, ist in diesem Lambda-Staates Code

ich tun möchte:

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

Mein Code:

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

Aber da kann ich nicht schreiben das Prädikat richtig, erhalte ich den folgenden Fehler:

exceptionMessage = Beispielmerkmal 'M1_TotalLossM2_TotalLoss' nicht für Typ 'FooDomain' definiert.

Antwort

2

Lassen sehen, was wir hier haben:

x => x.M1_TotalLoss + x.M2_TotalLoss 

x offenbar einParameter ist, so

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

in Ordnung ist.

x.M1_TotalLoss und x.M2_TotalLoss sind Eigenschaften des Parameterx genannt bzw. "M1_TotalLoss" und "M2_TotalLoss", so lassen Sie reflektieren, dass:

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

und x.M1_TotalLoss + x.M2_TotalLoss ist nur der Betrieb der beiden hinzu:

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

und Sie sind fertig - der Rest des Codes ist in Ordnung.

Was ist mit mehr als 2 Eigenschaften?

op1 + op2 + op3 Da entsprechen die (op1 + op2) + op3, oder mit Verfahren Notation Add(Add(op1, op2), op3), kann es, dass N Additionen wie das Hinzufügen des nächsten Operanden zu dem Ergebnis der Addition der Operanden vorhergehenden rekursiv beschrieben gesehen werden können. Welche kann leicht mit LINQ Aggregate Methode implementiert werden. So IEnumerable<string> gegeben

die gewünschten Eigenschaftsnamen enthalten, können Sie so etwas wie folgt verwenden:

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

Eigentlich war es ein einfaches question.I nicht sehen expression.add Ich bin gekommen, meine Frage zu beantworten Dann sah ich deine Antwort, die ich als Anser gemacht habe. Danke vielmals –