Szukałam różnicę między Select
a SelectMany
, ale nie udało się znaleźć odpowiednią odpowiedź. Muszę nauczyć się różnicy podczas korzystania z LINQ To SQL, ale wszystko, co znalazłem, to standardowe przykłady tablic.
Czy ktoś może podać przykład LINQ To SQL?
c#
linq-to-sql
linq
Tarik
źródło
źródło
Odpowiedzi:
SelectMany
spłaszcza zapytania, które zwracają listy list. Na przykładWersja demonstracyjna na żywo .NET Fiddle
źródło
Wybierz wiele jest jak operacja łączenia krzyżowego w SQL, gdzie bierze produkt krzyżowy.
Na przykład jeśli mamy
Wybierz wiele, aby uzyskać następujący zestaw
Zauważ, że tutaj bierzemy wszystkie możliwe kombinacje, które można wykonać z elementów zestawu A i zestawu B.
Oto przykład LINQ, którego możesz spróbować
mix będzie miał następujące elementy w płaskiej strukturze, takie jak
źródło
SelectMany
jest . Jest to raczej sposób, któregoSelectMany
można użyć, ale tak naprawdę nie jest to normalny sposób korzystania z niego.Where
stan po SelectMany...
źródło
SelectMany()
pozwala zwinąć wielowymiarową sekwencję w sposób, który wymagałby sekundySelect()
lub pętli.Więcej szczegółów w tym poście na blogu .
źródło
Istnieje kilka przeciążeń do
SelectMany
. Jeden z nich pozwala śledzić wszelkie relacje między rodzicem a dziećmi podczas przechodzenia przez hierarchię.Przykład : załóżmy, że mają następującą strukturę:
League -> Teams -> Player
.Możesz łatwo zwrócić płaską kolekcję graczy. Możesz jednak stracić wszelkie odniesienia do drużyny, w której zawodnik jest członkiem.
Na szczęście w tym celu występuje przeciążenie:
Poprzedni przykład pochodzi z bloga IK Dana . Zdecydowanie polecam przyjrzeć się temu.
źródło
Rozumiem,
SelectMany
że działam jak skrót do łączenia.Więc możesz:
źródło
.SelectMany(c => new {c.CompanyName, c.Orders.ShippedDate});
nie działa. SelectMany raczej spłaszcza listę list - i możesz wybrać dowolną (ale tylko jedną) z zawartych list dla wyniku. Dla porównania: połączenie wewnętrzne w Linq .Select to prosta projekcja jeden na jeden z elementu źródłowego na element wynikowy. Wybierz - Wiele jest używane, gdy w wyrażeniu zapytania występuje wiele klauzul: każdy element w oryginalnej sekwencji jest używany do generowania nowej sekwencji.
źródło
Niektóre SelectMany mogą nie być konieczne. Poniżej 2 zapytań daje ten sam wynik.
W przypadku relacji jeden do wielu
źródło
Bez nadmiernej wiedzy technicznej - baza danych z wieloma organizacjami, każda z wieloma użytkownikami: -
oba zwracają tę samą listę ApplicationUser dla wybranej organizacji.
Pierwsze „projekty” od organizacji do użytkowników, drugie bezpośrednio sprawdzają tabelę użytkowników.
źródło
Jest bardziej jasne, gdy zapytanie zwraca ciąg znaków (tablicę znaków):
Na przykład jeśli lista „Owoce” zawiera „jabłko”
„Wybierz” zwraca ciąg znaków:
„SelectMany” spłaszcza ciąg:
źródło
Tylko dla alternatywnego widoku, który może pomóc niektórym funkcjonalnym programistom:
Select
jestmap
SelectMany
jestbind
(lubflatMap
dla twoich ludzi Scala / Kotlin)źródło
Rozważ ten przykład:
Tak więc, jak widzisz, zduplikowane wartości, takie jak „I” lub „lubię to”, zostały usunięte z zapytania 2, ponieważ „SelectMany” spłaszcza i wyświetla w wielu sekwencjach. Ale zapytanie1 zwraca sekwencję tablic łańcuchowych. a ponieważ w zapytaniu 1 znajdują się dwie różne tablice (pierwszy i drugi element), nic nie zostanie usunięte.
źródło
Jeszcze jeden przykład, w jaki sposób SelectMany + Select można wykorzystać do gromadzenia danych obiektów podtablicy.
Załóżmy, że mamy użytkowników z ich telefonami:
Teraz musimy wybrać BaseParts wszystkich użytkowników wszystkich użytkowników:
źródło
usersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))
Oto przykład kodu z zainicjowaną małą kolekcją do testowania:
źródło
Te
SelectMany
metody uderzenia w dółIEnumerable<IEnumerable<T>>
w produktIEnumerable<T>
, podobnie jak komunizm, każdy element jest zachowywał się w taki sam sposób (głupi facet ma takie same prawa geniuszem jednym).źródło
Myślę, że to najlepszy sposób na zrozumienie.
Przykład tabliczki mnożenia.
źródło