2012-07-17 67 views
0

我有这个疑问:LINQ到SQL - 查询获得计数(),即使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 

UPDATE: 这就是学生,类和SickDays看喜欢用@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 }, 
}; 

好上面现在是正确的,对于这样的困惑对不起!

+0

等待!我对'更新'感到困惑。我以学生,班级和生病日为例,但我的应用程序使用了不同的对象 - 几分钟时间与我分开,而我精确地列出了学生,课程和病假日的样子。 – Dean 2012-07-17 03:11:27

+0

好吧,现在是正确的......再次,我真的很抱歉 – Dean 2012-07-17 03:15:20

回答

4

这就是所谓的Left Outer Join。在这种情况下,即使他们没有生病日,也需要每个学生。所以,我们会与学生开始,进行左外与病假加入,然后返回您指定了其相匹配的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) 
     }; 
+0

[这工作,假设我的理解是正在清点东西。(http://ideone.com/p12ts) – user7116 2012-07-17 02:11:20

+0

只是为了让你知道,@sixlettervariables,我 – Dean 2012-07-17 03:17:46

+0

冠军你现在还在测试您的解决方案,它的工作原理!即使当我对自己的问题感到困惑时,你也能理解它:-)非常感谢! – Dean 2012-07-17 03:29:36

0

所以你想要所有的学生,即使他们不在课堂上?那么你需要一个我相信的左连接。用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) 

我希望能让你走向正确的方向。

+1

这不是失踪的学生,而是生病的一天。 – user7116 2012-07-17 01:48:27