2016-07-23 14 views
1

Dies ist meine Tabellenstrukturfalsche Summe und zählen, in Linq

ID A  B  C  D 

1 null 10 5  null 
2 3  5  null D2 
3 8  null 2  D2 
4 null 4  3  D1 
5 4  6  1  D2 

Dies ist C# -Klasse und sein Eigentum zu speichern Abfrageergebnis.

public class GrillTotals 
{ 
     public int? SumOfA {get; set;} 

     public int? SumOfB{get; set;} 

     public int? SumOfC{get; set;} 

     public int? CountOfD1{get; set;} 

     public int? CountOfD2{get; set;} 
} 

Was ich erwarte, ist:

SumOfA = 15 
SumOfB = 20 
SumOfC = 11 
CountOfD1 = 1 
CountOfD2 = 3 

Was ich erhalte ist: SumOfA = null, SumOfB = null, SumOfC = null, CountOfD1 = 0, CountOfD2 = 0

Hier ist ein Code, den ich ausprobiert habe.

var _FinalResult = from s in dbContext.tblSchedules 
group s by new 
{ 
    s.A, 
    s.B, 
    s.C, 
    s.D, 
} into gt 
select new GrillTotals 
{ 
    SumOfA = gt.Sum(g => g.A), 
    SumOfB = gt.Sum(g => g.B), 
    SumOfC = gt.Sum(g => g.C), 
    CountOfD1 = gt.Count(g => g.D == "D1"), 
    CountOfD2 = gt.Count(g => g.D == "D2"), 
}; 

Versuchen Sie mich zu korrigieren, wenn ich etwas falsch oder falsch mache. Jede Hilfe wird geschätzt.

+6

10 + 5 + 4 + 6 20? –

+0

Verwenden Sie die ?? Operator. –

+0

wo kann ich ?? –

Antwort

2

Sie sollten nicht durch die Felder Gruppierung werden Sie Aggregate berechnet werden soll. Wenn Sie nach ihnen gruppieren, wird jedes Aggregat (Sum, Min, Max usw.) den Wert selbst zurückgeben (und Count 1 oder 0 abhängig von der Bedingung).

Aus was ich sehe, versuchen Sie, mehrere Aggregate mit einzelnen SQL-Abfrage zurückzugeben. Wenn das korrekt ist, ist es möglich, Gruppe durch konstante Technik zu verwenden.

ersetzen Gerade

group s by new 
{ 
    s.A, 
    s.B, 
    s.C, 
    s.D, 
} into gt 

mit

group s by 1 // any constant 
into gt 
+1

Vielen Dank, Ihre Mühe hat für mich funktioniert. –

0

Versuchen Sie folgendes:

var _FinalResult = from s in dbContext.tblSchedules 
group s by new 
{ 
    s.A, 
    s.B, 
    s.C, 
    s.D, 
} into gt 
select new GrillTotals 
{ 
    SumOfA = gt.Sum(g => g.A ?? 0), 
    SumOfB = gt.Sum(g => g.B ?? 0), 
    SumOfC = gt.Sum(g => g.C ?? 0), 
    CountOfD1 = gt.Count(g => g.D == "D1"), 
    CountOfD2 = gt.Count(g => g.D == "D2"), 
};