Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Lambda sum problem


julia24 - Mo 09.02.15 22:06
Titel: Lambda sum problem

C#-Quelltext
1:
2:
3:
4:
var summe1 = from l in db.Lg7s
&& new int[]{0,40}.Contains(l.CREATE)
&& l.ANSWERING>0
select (l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME)).Sum(i => i);

Ich würde das gerne in diese Abfrage einbauen. Bei Summe1 habe ich den versuch gemacht. Leider funktioniert das so nicht.(also schon alleine die Syntax nicht) Kann mir jemand helfen?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var pilotgroup = (from l in db.Lg7
                  where c.IdClasse == "7"
                  select l)
                  .GroupBy(l => l.NUMBER)
                  .Select(group => new
                  {
                    T4Number = group.Count(lg => lg.TALKINGTIME == 0),

                    Summe1 = group.Select(new {l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME}).Sum(lg => new int[]{38,40}.Contains(lg.CAUSE) && lg.ANSWERING>0)
                  }


Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Stundenplan - Di 10.02.15 11:21

Kleiner Tipp, C#-Codetags gehen mit [cs][/cs]. ;-)
Zitat:


C#-Quelltext
1:
2:
3:
4:
var summe1 = from l in db.Lg7s 
&& new int[]{0,40}.Contains(l.REATE) 
&& l.ANSWERING>0 
select (l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME)).Sum(i => i);



Bei den &&s fehlt was, und zwar das where:

C#-Quelltext
1:
from l in db.Lg7s where new int[]{...}.Contains(...) && l.ANSWERING > 0                    

Außerdem macht das .Sum(i => i) wenig Sinn, wenn du in der select-Klammer schon Zeiten aufsummierst.

Bei group.Select(new {l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME}) muss, wie beim oberen Select, ein Lambda mit Argument übergeben werden, also z.B. .Select(group => ...). Allerdings macht ein new {} wenig Sinn, wenn das einzige Element des on the fly erstellten Objektes eine Summe ist. Wie du das dann aber mit .Sum weiterverarbeiten willst, kann ich leider nur erraten. Vllt. kannst uns mal nen Abriss geben, was du genau machen willst.


julia24 - Di 10.02.15 12:49

Also eigentlich will ich folgendes Statment (welches einzeln auch schon funktioniert hat),
in ein Statement mit Lambda umschreiben.


C#-Quelltext
1:
2:
3:
4:
var summe1 = from l in db.Lg7s
where new int[]{0,40}.Contains(l.REATE)
&& l.ANSWERING>0
select (l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME)).Sum(i => i);


Hier ist mein versuch:


C#-Quelltext
1:
Summe1 =group.Where(lg => new int[]{38,40}.Contains(lg.CAUSE) && lg.ANSWERING>0).Select(lg => new {DurationOfCallProcessing = lg.TALKINGTIME + lg.EN_ ONHOLDTIME + lg.ACTIONTIME + lg.UPTIME }).Sum(),                    


Leider zeigt er mir aber an, dass die Sum hier nicht zulässig ist.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Am ende soll es so aussehen. 
  var pilotgroup = (from l in db.Lg7
                              where c.IdClasse == "7"
                              select l)
                                .GroupBy(l => l.NUMBER)
                                .Select(group => new
                                { 

T4Number = group.Count(lg => lg.TALKINGTIME == 0),

Summe1 = group.Select(new {l.TALKINGTIME + l.ONHOLDTIME + l.ACTIONTIME + l.UPTIME}).Sum(lg => new int[]{38,40}.Contains(lg.CAUSE) && lg.ANSWERING>0)
}



Ich weiß nicht, wie ich diese Addition einbaue.

Normalerweise könnte ich ja schreiben



C#-Quelltext
1:
2:
Summe1 = group.Sum(lg => new int[]{38,40}.Contains(lg.CAUSE) && lg.ANSWERING>0)
}


Was ist aber jetzte, wenn ich die Summe der 4 Spalten addiert haben will.


julia24 - Di 10.02.15 13:03

Ich hab die Lösung denk ich gefunden:


C#-Quelltext
1:
2:
3:
T4Number =  group
    .Where(lg => new int[]{38,40}.Contains(lg.CAUSE) && lg.ANSWERING>0)
    .Sum(lg => lg.EN_ TALKINGTIME + lg.EN_ ONHOLDTIME + lg.EN_ ACTIONTIME + lg.UPTIME);