2011-07-08 53 views
1

我需要幫助下面的SQL查詢轉換爲LINQ:是否需要轉換SQL到LINQ幫助 - LEFT JOIN以計數

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}     
     ); 

預先感謝您!

+1

見(http://msdn.microsoft.com/en-us/vcsharp/ee908647#leftouterjoin) –

+0

我已經計算出來[上的LINQ 101聯接運算符。以下表達式起作用! var results = Teachers .Select(t => new {TeacherID = t.TeacherID,FirstName = t.FirstName,LastName = t.LastName,Title = t.Title,Grade = t.Grade,Count = t.Students.Count, }); results.ToList()轉儲(); – rk1962

回答

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(); 
1

爲了做一個左連接,你需要使用DefaultIfEmpty()方法,像這樣:

from r in results.DefaultIfEmpty() 
+0

我早些時候嘗試過,它在LINQPad中引發以下錯誤:InvalidOperationException:無法將null值分配給類型爲System.Int32的成員,該成員屬於非空值類型。 – rk1962

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}     
    ); 
+0

我以前試過這個,它在LINQPad中引發下面的錯誤:InvalidOperationException:無法將null值分配給類型爲System.Int32的成員,該成員屬於非空值類型 – rk1962