/ / Як додати ліве зовнішнє приєднання до згрупованого та підсумованого запиту LINQ - c #, linq

Як додати лівий зовнішній зв'язок для групування та підбиття запиту LINQ - c #, linq

У мене є таблиця працівників:

EmployeeID  |  EmployeeName
---------------------------
1           |  Jack
2           |  Jill
3           |  Roger

І таблиця випадків:

OccurrenceID  |  EmployeeID  |  Points
--------------------------------------
1             |  1           |  5
2             |  2           |  3
3             |  1           |  1

У мене є робочий запит LINQ, який групує та підсумовує дві таблиці:

groupedOccurrences = (from o in db.Occurrences.Include(o => o.Employee)
where o.OccurrenceDate >= beginDate
&& o.OccurrenceDate <= endDate
group o by o.Employee.EmployeeName into g
select new OccurrenceByQuarter
{
Name = g.Key,
Total = g.Sum(o => o.Points)
});

Який виробляє цей висновок:

 Jack 6
Jill 3

Але я хочу, щоб співробітник Роджер з’явився у результатах з 0 балами. Я спробував додати приєднання до запиту LINQ таким чином:

groupedOccurrences = (from e in db.Employees
from o in db.Occurrences
join o in db.Occurrences on e.EmployeeID equals o.EmployeeID into j1
from j2 in j1.DefaultIfEmpty()
group j2 by e.EmployeeName into g
select new OccurrenceByQuarter
{
Name = g.Key,
Total = g.Sum(o => o.Points)
});

Але в підсумку кількість балів сильно завищується (як у 24 рази більше, ніж вони "повинні бути").

Я також намагався отримати Total, щоб повернути 0, якщо null, змінивши декларацію Total на public int? Total { get; set; } у своєму класі OccurrencesByQuarter, але тоді, коли я намагаюся змінити запит LINQ на включення Total = g.Sum(o => o.Points) ?? 0 Я отримую повідомлення про помилку: "Оператор ?? не можна застосовувати до операндів типу int та int".

Будь-яка допомога буде дуже вдячна.

Відповіді:

6 за відповідь № 1

Використовувати приєднання до групи:

groupedOccurrences = (from e in db.Employees
join o in db.Occurrences.Where(x =>
x.OccurrenceDate >= beginDate &&
x.OccurrenceDate <= endDate)
on e.EmployeeID equals o.EmployeeID into g
select new OccurrenceByQuarter
{
Name = e.EmployeeName,
Total = g.Sum(x => (int?)x.Points) ?? 0
});

Результат буде:

Jack  6
Jill  3
Roger 0

Для того, щоб повернутися 0 для порожніх груп приводять підсумоване властивість до нульового, а потім застосовують оператор нульового злиття для повернення значення за замовчуванням: g.Sum(x => (int?)x.Points) ?? 0