Code auslagern anhand von Lambda Expressions


julia23

Mitglied
C#:
var pilotgroup = (from t1 in db.Tabelle1
  join t2 in db.Tabelle2 on t1.NUMBER equals t2.Id
  where t2.IdClasse == "10"
  select t1)
  .GroupBy(t1 => t1.NUMBER)
  .Select(group => new
  {
  pilotId = group.Key,
  NUMBER = group.FirstOrDefault().NUMBER,
  
AuftragerhaltenGHT = group.Count(lg => lg.NUMBER == 0 && new int[] {31, 32, 40 }.Contains(lg.CAUSE)),

 // hier kommen noch ca 100 solcher Abfragen, nach dem gleichen schema....
AuftragerhaltenGTR= group.Count(lg => lg.NUMBER == 1 && new int[] { 56, 40 }.Contains(lg.CAUSE)),

...

})

  ;

Die Expressions nach group.Count, würde ich gerne in Lambda Expressions auslagern.
Mein Versuch:

C#:
Func<int, int> test = lg => lg => lg.NUMBER == 0 && new int[] {31, 32, 40 }.Contains(lg.CAUSE);

//damit ich das dann wie folgt auslagern kann...
AuftragerhaltenGTR= group.Count(test);

Da wird aber ausgegeben, " nicht alle werte geben einen Ausdruck vom Typ int, int zurück"...

Ich denke da ist Grundsätzlich der Wurm drin. Kann mir jemand von euch auf die Sprünge helfen?
 

Cromon

Erfahrenes Mitglied
Hallo julia23

Erstes Problem: Du erstellst da ein Lambda-Ausdruck, der wieder einen Lambdausdruck zurückgibt. Wenn du es nicht in einer Zeile formulierst ist es relativ offensichtlich:
C#:
        Func<int, int> f =
            lg =>
                lg =>
                    lg.NUMBER == 0 && new[]{31, 32, 40}.Contains(lg.CAUSE);

Du müsstest also den äusseren Lambdaausdruck weglassen.

Zweites Problem:
Func<int, int> bedeutet: 1 Parameter vom Typ int, Rückgabewert vom Typ int

lg ist also ein int, int hat aber weder einen Member NUMBER noch einen Member CAUSE.

Zu guter letzt solltest du nicht alles auslagern, sondern nur den Teil, der in allen Teilen auch gleich ist. Eine Möglichkeit wäre sowas:
C#:
Func<LG_TYPE, int, int[], bool> f = (lg, targetNumber, validCauses) =>  lg.NUMBER == targetNumber && validCauses.Contains(lg.CAUSE);
// ...
AuftragerhaltenGHT = group.Count(lg => f(lg, 0, new[]{31,32,40})),
AuftragerhaltenGTR = group.Count(lg => f(lg, 1, new[]{56,40}))
// ...