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