2016-07-23 5 views
1

Это моя структуру таблицыПолучение неправильной суммы и рассчитывать в 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 

Это C# класса и его свойство результата магазина запроса.

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;} 
} 

Что я ожидаю:

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

Что я получаю: SumOfA = нуль, SumOfB = нуль, SumOfC = нуль, CountOfD1 = 0, CountOfD2 = 0

Код - это то, что я пробовал.

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"), 
}; 

Попытайтесь исправить меня, если я что-то делаю неправильно или неправильно. Любая помощь будет оценена по достоинству.

+6

10 + 5 + 4 + 6 20? –

+0

Использовать ?? оператор. –

+0

где я могу использовать ?? –

ответ

2

Вы не должны быть группирование по полям вы хотите, чтобы вычислить агрегаты. Когда вы группируете их, каждый агрегат (Sum, Min, Max и т. Д.) Вернет само значение (и Count 1 или 0 в зависимости от условия).

Из того, что я вижу, вы пытаетесь вернуть несколько агрегатов с одним SQL-запросом. Если это правильно, можно использовать группу по постоянной методике.

Просто замените

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

с

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

Большое спасибо, ваше усилие сработало для меня. –

0

Попробуйте это:

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"), 
}; 
Смежные вопросы