2013-04-07 265 views
0
过滤子元素

我有以下实体:LEFT JOIN在LINQ

student (
    studentID int, 
    name string 
) 


subject (
    .... 
    studentID int, 
    passed bit, 
    date date 
) 

我希望有一个表来显示所有的学生和学科计数的名单,学生可在2012年

然后我创建下面的linq,但失败。

(from x in db.student 
    join y in db.subject on x.studentID equals y.studentID into z 
from s in z.DefaultIfEmpty() where s.date.Year.Equals(2012) 
    select new { 
     x.studentID, 
     x.name, 
     SubjectPassCount = y.passed.Equals(true).Count 
}).Distinct() 

有人请帮忙吗?感谢

回答

0

试试这个

var results = 
    (from x in db.student 
    join y in db.subject.Where(s => s.date.Year == 2012 && s.passed) 
     on x.studentID equals y.studentID into z 
    select new 
    { 
      x.studentID, 
      x.name, 
      SubjectPassCount = z.Count() 
    }) 
    .Distinct() 

或可能

var results = 
    (from x in db.student 
    join y in db.subject 
     on new { x.studentID, 2012, true } equals new { y.studentID, y.date.Year, y.passed } into z 
    select new 
    { 
      x.studentID, 
      x.name, 
      SubjectPassCount = z.Count() 
    }) 
    .Distinct() 
+0

“计数(谓词)”方法不支持LINQ to Entities。 – MarcinJuraszek 2013-04-07 14:20:06

+0

@MarcinJuraszek我认为这是固定在EF的最新版本。无论如何,我更新了我的答案。 – 2013-04-07 14:23:55

0

我会更where条件一点点。您还需要声明group by来统计每个学生的科目数量。

(from x in db.student 
join y in db.subject.Where(s => s.date.Year == 2012 && s.passed == true) on x.studentID equals y.studentID into z 
from s in z.DefaultIfEmpty() 
group new {x, s} by new { x.studentID, x.name } into g 
select new { 
    g.Key.studentID, 
    g.Key.name, 
    SubjectPassCount = g.Where(gi => gr.s != null).Count() 
}).Distinct() 
0

如果有一个导航属性student.subjects那样简单

from x in db.student 
    select new { 
     x.studentID, 
     x.name, 
     SubjectPassCount = x.subjects.Where(s => s.passed && s.Year == 2012) 
            .Count() 
    }) 

(或x.subjects.Count(s => s.passed && s.Year == 2012)其在EF 5至少支持)它可以。