Przeszukałem sieć, ale wciąż nie mogę znaleźć prostej odpowiedzi. Czy ktoś może wyjaśnić (prostym językiem angielskim), co to GroupJoin
jest? Czym różni się od zwykłego wewnętrznego Join
? Czy jest powszechnie używany? Czy to tylko dla składni metody? Co ze składnią zapytania? Przykład kodu c # byłby miły.
c#
linq
linq-to-entities
duyn9uyen
źródło
źródło
Odpowiedzi:
Zachowanie
Załóżmy, że masz dwie listy:
Kiedy wy
Join
dwie listy wId
polu wynik będzie:Kiedy wy
GroupJoin
dwie listy wId
polu wynik będzie:Tak więc
Join
tworzy płaski (tabelaryczny) wynik wartości nadrzędnych i podrzędnych.GroupJoin
tworzy listę wpisów na pierwszej liście, każda z grupą połączonych wpisów na drugiej liście.Dlatego
Join
jest odpowiednikiemINNER JOIN
SQL: nie ma wpisów dlaC
. ChociażGroupJoin
jest odpowiednikiemOUTER JOIN
:C
znajduje się w zestawie wyników, ale z pustą listą powiązanych pozycji (w zestawie wyników SQL byłby wierszC - null
).Składnia
Więc niech się dwie listy
IEnumerable<Parent>
iIEnumerable<Child>
odpowiednio. (W przypadku Linq do podmiotów:)IQueryable<T>
.Join
składnia byłabyzwracanie
IEnumerable<X>
gdzie X jest anonimowym typem o dwóch właściwościach,Value
iChildValue
. Ta składnia zapytania używaJoin
metody pod maską.GroupJoin
składnia byłabyzwracanie
IEnumerable<Y>
gdzie Y jest anonimowym typem składającym się z jednej właściwości typuParent
i właściwości typuIEnumerable<Child>
. Ta składnia zapytania używaGroupJoin
metody pod maską.Moglibyśmy po prostu zrobić
select g
to drugie zapytanie, które wybrałobyIEnumerable<IEnumerable<Child>>
, powiedzmy listę list. W wielu przypadkach wybór z dołączonym rodzicem jest bardziej przydatny.Niektóre przypadki użycia
1. Wykonanie płaskiego połączenia zewnętrznego.
Jak powiedziano, oświadczenie ...
... tworzy listę rodziców z grupami dzieci. Można to zmienić w płaską listę par rodzic-dziecko, dodając dwa małe dodatki:
Wynik jest podobny do
Zauważ, że zmienna zakresu
c
jest ponownie używana w powyższej instrukcji. W ten sposób dowolnąjoin
instrukcję można po prostu przekonwertować na instrukcjęouter join
, dodając odpowiednikinto g from c in g.DefaultIfEmpty()
do istniejącejjoin
instrukcji.Tutaj świeci składnia zapytania (lub kompleksowa). Metoda (lub płynna) składnia pokazuje, co się naprawdę dzieje, ale trudno jest napisać:
Tak więc mieszkanie
outer join
w LINQ jestGroupJoin
spłaszczone oSelectMany
.2. Zachowanie porządku
Załóżmy, że lista rodziców jest nieco dłuższa. Niektóre interfejsy użytkownika tworzą listę wybranych rodziców jako
Id
wartości w ustalonej kolejności. Użyjmy:Teraz wybrani rodzice muszą zostać odfiltrowani z listy rodziców w dokładnie takiej kolejności.
Jeśli zrobimy ...
... kolejność
parents
określa wynik. Jeśli rodzice zostaną zamówieni przezId
, wynikiem będą rodzice 2, 3, 4, 7. Nie dobrze. Możemy jednak również użyćjoin
do filtrowania listy. Przy użyciuids
jako pierwszej listy kolejność zostanie zachowana:Wynikiem są rodzice 3, 7, 2, 4.
źródło
Według eduLINQ :
Jedyną różnicą jest instrukcja return:
Dołącz :
Dołącz do grupy :
Przeczytaj więcej tutaj:
Ponowne wdrażanie LINQ do obiektów: część 19 - łączenie
Ponowne wdrażanie LINQ do obiektów: część 22 - GroupJoin
źródło