Dzisiaj podstawy, ale wcześniej nie miałem potrzeby skorzystania z funkcji GroupJoin. Myślę, że prosty przykład jest najlepszą dokumentacją.
Dosyć częstą używaną funkcją jest GroupBy. Jeśli mamy np. listę zamówień w postaci (IdCustomer, Name), wykonując GroupBy na IdCustomer otrzymamy słownik, gdzie kluczem jest identyfikator zamówienia, a wartością lista zamówień danego klienta.
GroupJoin, jak sama nazwa sugeruje jest połączeniem Join z GroupBy. Załóżmy, że mamy następujące encje:
class CustomerInfo { public int Id { get; set; } public string Name { get; set; } } class Order { public int IdCustomer { get; set; } public string Name { get; set; } }
Następnie przykładowe dane, definiujące relacje wyglądają następująco:
var customers = new CustomerInfo[3]; customers[0] = new CustomerInfo() { Id = 1, Name = "Piotr" }; customers[1] = new CustomerInfo() { Id = 2, Name = "Pawel" }; customers[2] = new CustomerInfo() { Id = 3, Name = "tertert" }; var orderList = new Order[5]; orderList[0] = new Order() { IdCustomer = 1, Name = "Zamowienie 1" }; orderList[1] = new Order() { IdCustomer = 1, Name = "Zamowienie 1 a" }; orderList[2] = new Order() { IdCustomer = 2, Name = "Zamowienie 2 a" }; orderList[3] = new Order() { IdCustomer = 2, Name = "Zamowienie 2 b" }; orderList[4] = new Order() { IdCustomer = 3, Name = "Zamowienie 3" };
W celu uzyskania zamówień dla konkretnego klienta wystarczy:
var customerOrders = customers.GroupJoin(orderList, x => x.Id, x => x.IdCustomer, (customer, orders) => new { CustomerName = customer.Name, Orders = orders.ToArray() }); foreach (var customerOrder in customerOrders) { Console.WriteLine(customerOrder.CustomerName); foreach (var order in customerOrder.Orders) { Console.WriteLine("\t{0}", order.Name); } }
Czy LINQ to Entities radzi sobie z translacją tego na SQL?
A jak z wydajnością? Jaki SQL się za tym kryje? Kiedy następuje materializacja?
Czy LINQ to Entities radzi sobie z translacją tego na SQL?
Nie tyle sobie dobrze radzi, co jest on konieczny do użycia odpowiednika SQLowego Left Joina.