需要帮助将SQL转换为LINQ - LEFT JOIN with Count

时间:2011-07-08 18:22:42

标签: c# linq linq-to-sql

我需要帮助将以下SQL查询转换为LINQ:

 select s.teacherid,t.lastname,t.firstname,t.title,t.grade, count(s.TeacherID) 
    from Teacher t
    left join Student s on t.teacherid = s.teacherid
    and t.isactive = 1
    and s.isactive = 1
    group by s.TeacherID,t.lastname,t.firstname,t.title,t.grade

I tried the following but it is not returning teacher records who have no students:

    var teachers = 
       (from t in Teachers
        join s in Students on t.TeacherID equals s.TeacherID 
        into results
        where t.IsActive == true 
        from r in results                                       
        group r by new { r.TeacherID, r.Teacher.FirstName, r.Teacher.LastName, r.Teacher.Title, r.Teacher.Grade} into g
       select new  { TeacherID = g.Key.TeacherID,FirstName = g.Key.FirstName, LastName = g.Key.LastName, Title=g.Key.Title, Grade = g.Key.Grade}                
       );

提前谢谢!

3 个答案:

答案 0 :(得分:1)

要进行左连接,您需要使用DefaultIfEmpty()方法,如下所示:

from r in results.DefaultIfEmpty()

答案 1 :(得分:0)

var teachers = 
   (from t in Teachers
    join s in Students on t.TeacherID equals s.TeacherID 
    into results
    where t.IsActive == true 
    from r in results.DefaultIfEmpty()                                       
    group r by new { r.TeacherID, r.Teacher.FirstName, r.Teacher.LastName, r.Teacher.Title, r.Teacher.Grade} into g
    select new  { TeacherID = g.Key.TeacherID,FirstName = g.Key.FirstName, LastName = g.Key.LastName, Title=g.Key.Title, Grade = g.Key.Grade}                
   );

答案 2 :(得分:0)

我做了一些研究并找到了解决方案。以下表达式修复了它:

var results = Teachers
              .Where(t => t.IsActive == true)
              .Select(t => 
              {
                  TeacherID  = t.TeacherID,
                  FirstName = t.FirstName,
                  LastName = t.LastName,
                  Title = t.Title,
                  Grade = t.Grade,
                  Count = t.Students.Where(s => s.IsActive == true).Count()                 
              });   
 results.ToList().Dump();