lý do tại sao các nhà thiết kế của LINQ không thể làm cho mọi việc đơn giản (sql giống như)
Họ có thể có. Nhưng định nghĩa của bạn về đơn giản (như một lập trình viên sql) không giống như định nghĩa của lập trình viên OO đơn giản. Linq (trong C#) là một công nghệ truy vấn cho các lập trình viên OO, đầu tiên. Ví dụ về điều này là lý do tại sao chọn đến cuối cùng. Đó là để thực hiện các quy tắc phạm vi trong hỗ trợ C# và intellisense trong trình soạn thảo.
Những lập trình viên này có thể không nhận được LEFT JOIN
(và thực sự bối rối nếu bạn nói LEFT OUTER JOIN
- nghĩ rằng có một số khác biệt, giống như một kế thừa từ khác).
Điều họ hiểu là GROUP JOIN
, hoạt động theo cách tương tự.
List<int> myInts = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> myOtherInts = new List<int>() { 1, 3, 5, 7, 9, 11, 13 };
//
var query = from i in myInts
join j in myOtherInts on i equals j into g
select new {key = i, myGroup = g};
//
foreach (var grouping in query)
{
Console.WriteLine("--{0}", grouping.key);
foreach (var x in grouping.myGroup)
Console.WriteLine(x);
}
Tất cả những gì DefaultIfEmpty
thứ làm là giải nén nhóm - làm phẳng các kết quả vào hàng/form cột - xa dạng heirarchical tự nhiên các lập trình viên OO của.DefaultIfEmpty
không cần thiết về mặt ngữ nghĩa để có được kết quả.
Dưới đây là cùng một truy vấn trong form method - mà trình biên dịch tạo ra từ bên trên và trong đó tôi thích:
var query = myInts.GroupJoin(
myOtherInts,
i => i,
j => j,
(i, g) => new { key = i, myGroup = g }
);
Ông có thể nói rằng về mặt gương sáng của mình?
Truy vấn này cung cấp cho bạn khách hàng, với đơn đặt hàng của họ dưới dạng bộ sưu tập được đính kèm. Bộ sưu tập đơn đặt hàng có thể trống. Nếu bạn có 50 khách hàng và 1000 đơn đặt hàng, bạn sẽ có 50 khách hàng trong kết quả.
from c in dc.Customers
join o in dc.Orders on c.custid equals o.custid into someOrders
select new CustomerWithOrders()
{theCustomer = c, theOrders = someOrders};
Truy vấn này cung cấp cho bạn hàng CustomerOrder. Nếu khách hàng có 5 đơn đặt hàng, khách hàng sẽ xuất hiện 5 lần, mỗi lần khớp với một đơn hàng khác. Nếu khách hàng có 0 đơn đặt hàng, khách hàng sẽ xuất hiện sau khi khớp với một đơn đặt hàng không. Nếu bạn có 50 khách hàng và 1000 đơn đặt hàng, bạn sẽ có 50-1049 hàng sau khi tham gia và ý nghĩa của một yếu tố trong kết quả khó xác định.
from c in dc.Customers
join o in dc.Orders on c.custid equals o.custid into temp
from x in temp.DefaultIfEmpty()
select new CustomerOrderHybrid() {theCustomer = c, theOrder = x}
Nếu chúng triển khai left join
, nó sẽ yêu cầu hình dạng kết quả của ví dụ thứ hai. Khi tôi sử dụng group join
, tốt hơn, tôi cũng sẽ không triển khai left join
trong một bước. Cấu trúc phân cấp kết quả truy vấn rất tuyệt vời.
Vâng tôi đoán nó có lẽ là khó khăn - Tôi muốn biết tại sao nó là khó khăn mặc dù ... – user52110
LINQ không phải là cú pháp đường. trình biên dịch không dịch bất kỳ biểu thức lambda INTO nào. Không ai nói gì về việc tạo ra SQL trong câu hỏi. -1 –
OK, tôi không tích cực nó là lambdas mỗi se, nhưng linq IS cú pháp đường, và được dịch sang các cuộc gọi phương pháp của trình biên dịch. –