sobota, 21 kwietnia 2012

LINQ Join Extension method

Zobaczmy na prosty model EF:






Standardowo chcąc wyciągnąć imię, nazwisko i miasto w którym mieszka klient, używamy SQL-o podobnej składni LINQ:


Code:
                var q = from c in contex.Customers
                        join ca in contex.CustomerAddresses on c.CustomerID equals ca.CustomerID
                        join a in contex.Addresses on ca.AddressID equals a.AddressID
                        select new{Customer = c, Address = a};

Takie zapytanie możemy przerobić do zapytania z wykorzystaniem Extension methods:


Code:
                var q2 = contex.Customers.Join(contex.CustomerAddresses, c => c.CustomerID, ca => ca.CustomerID,
                                               (c, ca) => new{Customer = c, CustomerAddress = ca})
                    .Join(contex.Addresses, ca => ca.CustomerAddress.AddressID, a => a.AddressID,
                          (ca, a) => new{ca.Customer, Address = a});

O ile pierwszy sposób jest bardzo czytelny, o tyle drugi może na pierwszy rzut oka wydawać się skomplikowany. Zwłaszcza metoda Join jest tutaj rozbudowana. Zobaczmy na jej budowę:


Code:
public static IQueryable<TResult> Join<TOuter,TInner,TKey,TResult>
(this IQueryable<TOuter> outer, 
IEnumerable<TInner> inner, 
Expression<Func<TOuter,TKey>> outerKeySelector, 
Expression<Func<TInner,TKey>> innerKeySelector, 
Expression<Func<TOuter,TInner,TResult>> resultSelector)

elementy które podajemy w tej metodzie:
  • outer - Extension method więc typ który jest przekazywany niejawnie (on nas nie interesuje na ten moment)
  • inner - źródło z którym nastąpi złączenie (w naszym przypadku była to tabela CustomerAddresses)
  • outerKeySelector oraz innerKeySelektor - dwa wyrażenia lambda, które definiują warunek złączenia (np. my łączymy po polu AddressId)
  • resultSelector - typ zwracany czyli odpowiednik select dla składni SQL-o podobnej


Code:
.Join
(źródło z którym łączymy, 
właściwość na podstawie której łaczymy zewnętrzna tabela, 
właściwość na podstawie której łaczymy wewnętrzna tabela, 
rezultat)

Brak komentarzy:

Prześlij komentarz