SQL Joins: C# Linq

Dużą część programistycznego czasu spędzamy na pracy z danymi.

Struktury przechowywania danych, bazy danych przechodzą ciągłą ewolucję, ale jako wynik zazwyczaj potrzebujemy jakiegoś podzbioru danych.

Myślę, że każdy z nas pracując z danymi myśli o nich w jakiś sposób, specyficzny, związany ze składowaniem. Ja jestem związana z relacyjnymi bazami danych i znormalizowanym przechowywaniem danych. Dlatego często, gdy potrzebuje jakiegoś podzbioru sięgam do SQL Join. I całej tabelki jak z nich korzystać. Ba, idąc dalej piszę często LINQ w składni sqla w ten sposób tłumacząc sobie składnie.

Ja chcę operować na dwóch kolekcjach. Dwóch kolekcjach całkowicie niezależnych obiektów - nie powiązanych żadną relacją w kodzie oprócz relacji biznesowej. Często spotykam się z takimi powiązaniami, integrując dane z kilku systemów. Logicznie, biznesowo, są one powiązane.
Zapytania SqlLike ułatwiają tworzenie nowych obiektów zawierających wszystkie zintegrowane dane. Dlatego małe przejście po joinach.

Wybrałam taki przykład.
Wybieranie dziewczyn na podstawie typów. Taki sam typ używam również w SQLu. Pole TypeName docelowo ma być wypełniane z drugiej tabeli poprzez złączenia, jednak drugie pole TypeIdentity które jest enum'em nie będzie kopiowane do pierwszego obiektu.
To tak jak widok w SQLu.
I takie złączenia i produkowanie nowych obiektów z kilku innych są moim zdaniem dobrym zastosowaniem wszelkich joinów.

Baza danych z jej zawartością do testów: tutaj
Ale zacznijmy powoli. Nie sugerujcie się do końca obrazkami. A dlaczego wyjaśnię później, jednak te obrazki to pierwsza odpowiedź Googla na pytanie o Joiny, dlatego i ja posłużę się tymi rysunkami.

Inner Join

Wynik operacji Iner Join to wszystkie elementy z dwóch kolekcji A i B, które spełniają warunek łączenia w obu kolekcjach.

SQL:


C#

Tutaj dokładnie widać tworzenie nowych obiektów do listy wynikowej. Taka operacja to odtworzenie zapytania SQL. Możemy też tylko odfiltrować listę a zwrócić elementy spełniające założenie bez tworzenia nowych jak w funkcji InnerJoinWithoutNewCollection.

Left Join

Wynik operacji Left Join to wszystkie elementy z kolekcji A, kolekcji z lewej strony złączenia, uzupełnione o elementy z kolekcji B. Kolekcja B może nie spełniać warunku złączenia, wtedy elementy z kolekcji A są zwracane bez uzupełnienia elementami z kolekcji B.

SQL

W SqlServer słówko OUTER jest opcjonalne w Left Join

C#

Konstrukcja SQLLike jest czytelniejsza, jednak kompilator i tak tworzy GroupJoin. Słówko kluczone into definiuje grupę na której możemy operować i np. zwrócić element domyślny w razie napotkania na brakujący element w kolekcji B.
Możliwe jest osiągnięcie tego samego wyniku poprzez SelectMany.


Te dwie operacje są podstawą do innych. Wystarczy dodać warunek if NULL, obrócić strony równania lub użyć kilku na raz.


Bibliografia

Komentarze

Popularne posty