2009-11-20 30 views
17

Có rất nhiều ví dụ về kết nối bên ngoài bằng cách sử dụng LINQ to Sql, tất cả chúng đều được đặt trên DefaultIfEmpty() không được hỗ trợ với LINQ to Entity Framework.Là một phép nối ngoài có thể với LINQ to Entity Framework

Điều này có nghĩa rằng ngoài tham gia là không thể với LINQ to Entity sử dụng .NET 3.5 (Tôi hiểu rằng DefaultIfEmpty đang đến với 4,0 --- nhưng điều đó không phải là một lựa chọn vào lúc này đối với tôi)

Có thể ai đó xin vui lòng cung cấp một ví dụ ngắn gọn bằng cách sử dụng LINQ to EntityFramework.

Trả lời

35

Trong LINQ to Entities, hãy suy nghĩ về các mối quan hệ thay vì tham gia SQL. Do đó, tương đương với nghĩa đen của một bên ngoài SQL tham gia vào một tổ chức Person với một số không hay một mối quan hệ với CustomerInfo sẽ là:

var q = from p in Context.People 
     select new 
     { 
      Name = p.Name, 
      IsPreferredCustomer = (bool?)p.CustomerInfo.IsPreferredCustomer 
     }; 

L2E sẽ kết hợp những tham gia, do đó nếu customerinfo là null thì biểu hiện toàn bộ đánh giá thành null. Do đó, cast vào một bool nullable, bởi vì kiểu suy luận của bool không nullable không thể giữ kết quả đó.

Đối với một-nhiều, bạn thường muốn có một hệ thống phân cấp, chứ không phải là một căn hộ, SQL kiểu tập kết quả:

var q = from o in Context.Orders 
     select new 
     { 
      OrderNo = o.OrderNo, 
      PartNumbers = from od in o.OrderDetails 
          select od.PartNumber 
     } 

này giống như một trái tham gia trong chừng mực bạn vẫn nhận được đơn đặt hàng không có chi tiết , nhưng nó là một đồ thị như OO chứ không phải là một bộ như SQL.

+2

Đây chính là loại câu trả lời chất lượng mà tôi đang tìm kiếm. Cảm ơn bạn! –

+1

+1 không đủ để có câu trả lời hay như thế này! – Arjang

+1

Cảm ơn bạn đã biết mẹo. Khi ai đó đánh vần nó như thế thì đột nhiên có vẻ rất rõ ràng trong L2E bạn nghĩ về mối quan hệ giữa các đồ vật chứ không phải bảng, nhưng tôi đã không nghĩ về nó. Một mắt mở thực sự ... – Quagmire

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