2011-11-10 91 views
0

我無法以下LEFT JOIN SQL轉換爲LINQ:LINQ的有條件加入

select Students.StudentID, StudentAddresses.state 
from Students left join Studentaddresses on (Students.StudentID = Studentaddresses.StudentID and StudentAddresses.Active=1) 
where (StudentAddresses.Rank =1 or StudentAddresses.StudentID is null) 
and Students.StudentID =3 

學生可以有零記錄或學生地址表中多條記錄,但只將記錄一個可活躍和排名= 1。

我能夠在linq中進行左連接,並使其正常工作。但是,如果學生在學生表中有兩個不活動記錄,我不知道如何讓學生記錄在最終結果中只出現一次。任何人都可以幫忙嗎?

+0

對不起,我的意思是「如果學生在StudentAddress表中的兩個不活動的記錄,我不知道如何讓學生記錄在最終結果中只出現一次。「學生只能擁有一個等級= 1的活動地址,這是數據庫中唯一的規則。 – user1040356

回答

0

使用Distinct()摺疊重複項。

var LeftJoin = (from student in Students 
       join address in (from address1 in StudentAddresses where address.Active select address1) 
       on student.StudentID equals address.StudentId 
       into JoinedStudentAddress 
       from joined in JoinedStudentAddress.DefaultIfEmpty() 
       select new       
       { 
        StudentID = student.StudentID, 
        State = joined != null ? joined.State : null 
       }).Distinct(); 

替代語法

var LeftJoin = Students.GroupJoin(StudentAddress.Where(a => a.Active), 
            s => s.StudentID, 
            a => a.StudentID, 
            (s,a) => new { Student = s, Addresses = a }) 
         .SelectMany(j = > j.Addresses.DefaultIfEmpty() 
            (s,a) => new { 
               StudentID = s.Student.StudentID, 
               State = a != null ? a.State : null 
            }) 
         .Distinct(); 
+1

我認爲'對student.StudentID = address.StudentId和address.Active'應該'對student.StudentID等於address.StudentId where address.Active' – StriplingWarrior

+0

@StriplingWarrior - 我正在修改我在其他地方找到的示例。我實際上並不使用LINQ語法,更喜歡流利的符號。感謝您指出了這一點。我已更新。 – tvanfosson

+0

謝謝!但系統不會讓我在「進入」之前放置一個「where」子句,因爲它認爲「where」結束了查詢。 – user1040356

0

這將是SQL語句轉換爲LINQ:

var q = from student in Students 
     from adress in Studentaddresses.Where(x => student.StudentID == x.StudentID && x.Active).DefaultIfEmpty() 
     where (adress.Rank == 1 || adress.StudentID == null) && student.StudentID == 3 
     select new       
     { 
      StudentID = student.StudentID, 
      State = adress.state 
     }; 
+0

該解決方案的工作原理!非常感謝你! – user1040356

+0

@ user1040356太好了!不要忘記接受答案。 – Magnus