У мене є таблиця працівників:
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