繁体   English   中英

Linq to SQL-即使0时也要获得count()的查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM