[英]Linq to SQL - a query to get a count() even when 0
我有這個查詢:
(from a in SickDays
join b in Class.Where(p => p.ID == myId) on a.Class_ID equals b.ID
join c in Student on a.Student_ID equals c.ID
group a by new { c.Name, c.Order } into ac
select new { Count = ac.Count(), Name = ac.Key.Name, Order = ac.Key.Order }
).OrderBy(f => f.Order)
返回:
Count | Name | Order
3 | Dave | a
2 | John | b
7 | Sally| c
但是我希望它返回此:
Count | Name | Order
3 | Dave | a
2 | John | b
7 | Sally| c
0 | Mark | d
0 | Betty| e
更新:這是使用@sixlettervariables示例的學生,班級和病假的外觀:
var Students = new List<Student>()
{
new Student { Id = 1, Name = "Al", Order = 'a' },
new Student { Id = 2, Name = "Betty", Order = 'b' },
new Student { Id = 3, Name = "Charles", Order = 'c' },
};
var Classes = new List<Class>()
{
new Class { Id = 1, Title = "A100" },
new Class { Id = 2, Title = "A200" },
};
var SickDays = new List<SickDay>()
{
new SickDay { Id = 1, StudentId = 1, ClassId = 1 },
new SickDay { Id = 2, StudentId = 1, ClassId = 1 },
new SickDay { Id = 3, StudentId = 1, ClassId = 2 },
new SickDay { Id = 4, StudentId = 1, ClassId = 2 },
new SickDay { Id = 5, StudentId = 2, ClassId = 1 },
};
好的,以上內容現在是正確的,對於造成的混亂,我們深表歉意!
這稱為左外部聯接 。 在這種情況下,即使沒有病假 ,也需要每個學生 。 因此,我們將從學生開始,在病假期間進行左外連接,然后返回與您指定的ID相匹配的班級數量:
var query =
from s in Students
join d in SickDays on s.ID equals d.Student_ID into gj
from sd in gj.DefaultIfEmpty()
group sd by new { s.Name, s.Order } into gg
select
new
{
Name = gg.Key.Name,
Order = gg.Key.Order,
Count = gg.Count(x => x != null && x.Class_ID == myId)
};
所以,即使他們不在班上,您也希望所有的學生嗎? 我認為您需要左加入。 與Linq這可以使用DefaultIfEmpty()實現
嘗試這個?
(from a in SickDays
join b in Class.Where(p => p.ID == myId) on a.Class_ID equals b.ID
join c in Student on a.Student_ID equals c.ID
into s
from students in s.DefaultIfEmpty()
group a by new { students.Name, students.Order } into ac
select new { Count = ac.Count(), Name = ac.Key.Name, Order = ac.Key.Order }
).OrderBy(f => f.Order)
我希望這能使您朝正確的方向發展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.