2011-11-15 36 views
7

Tôi đã dành 2 ngày cuối cùng để tìm hiểu cách thực hiện LEFT JOIN thực trong LINQ và tôi đã không thành công. Tôi có một bảng người dùng có cột "Primary2Address" trong đó có thể và thường là NULL. vì vậy tôi phải làm một LEFT JOIN ở đây. Ngoài ra, trong bảng Address, tôi có nhiều mối quan hệ có thể là NULL, vì vậy tôi phải làm nhiều LEFT JOINS.
Mọi nỗ lực LINQ tôi thực hiện một số câu lệnh sql SERIOUSLY CRAZY với UNIONS, câu lệnh SELECT lồng nhau và nhiều điều kỳ quặc hơn.
Tất cả tôi cần là:Làm thế nào để làm LEFT JOIN trong LINQ to Entities?

SELECT u.UserName FROM Users u 
LEFT JOIN Addresses a ON a.AddressiD = u.Primary2Address 
LEFT JOIN States s ON s.StateID = a.Address2State 
LEFT JOIN Countries c ON c.CountryID = a.CountryID 

Hãy giúp đỡ! Cho đến nay công việc của tôi xung quanh là tạo một thủ tục lưu trữ sử dụng câu lệnh sql của tôi ở trên, nhưng tôi thực sự muốn thử làm điều này với LINQ (L2E). Xin cảm ơn các bạn!

+3

Làm thế nào để truy vấn của bạn khác với chỉ 'CHỌN u.UserName TỪ Users u'? – svick

Trả lời

18

DefaultIfEmpty được sử dụng cho trái tham gia cho EntityFramework 4+

var query = from u in context.Users 
      from a in context.Addresses 
          .Where(x => u.Primary2Address == x.AddressiD) 
          .DefaultIfEmpty() 
      from s in context.States 
          .Where(x => a.Address2State == x.StateID) 
          .DefaultIfEmpty() 
      from c in context.Countries 
          .Where(x => a.CountryID == x.CountryID) 
          .DefaultIfEmpty() 
      select u.UserName; 
+0

Bạn là anh hùng của tôi! Wow, sau rất nhiều giờ .... Truy vấn của bạn cũng thẳng tiến khi họ đến và tôi hiểu ngay bây giờ. Cảm ơn một triệu Aducci! – Losbear

+0

Theo nhận xét của @ svick về câu hỏi, điều này khác với 'từ u trong ngữ cảnh. Người dùng chọn u.UserName' như thế nào? – AakashM

+0

@AakashM - Nếu bất kỳ người dùng nào có nhiều địa chỉ, bạn sẽ nhận được kết quả khác. Quan trọng hơn, tôi nghĩ câu hỏi đã được đơn giản hóa. – Aducci

Các vấn đề liên quan