Kontekst: W ciągu najbliższego miesiąca wygłosię trzy wykłady na temat lub przynajmniej LINQ
w kontekście C#
. Chciałbym wiedzieć, na które tematy warto poświęcić sporo uwagi, w oparciu o to, co ludzie mogą mieć trudności z zrozumieniem lub na co mogą mieć błędne wrażenie. Nie będę mówić o specjalnie LINQ
do SQL
lub Entity Framework wyjątkiem przykładów jak Zapytania mogą być wykonywane zdalnie za pomocą wyrażenia drzew (zwykle IQueryable
).
A więc, co ci tak trudno LINQ
? Co widziałeś w kategoriach nieporozumień? Przykładami mogą być następujące, ale nie ograniczaj się!
- Jak
C#
kompilator traktuje wyrażenia zapytania - Wyrażenia lambda
- Drzewa ekspresji
- Metody rozszerzenia
- Anonimowe typy
IQueryable
- Odroczone vs natychmiastowe wykonanie
- Streaming vs buforowane wykonanie (np. OrderBy jest odroczony, ale buforowany)
- Zmienne lokalne niejawnie wpisane
- Odczytywanie złożonych podpisów ogólnych (np. Enumerable.Join )
Odpowiedzi:
Opóźnione wykonanie
źródło
Wiem, że koncepcja odroczonego wykonania powinna być do mnie teraz pobita, ale ten przykład naprawdę pomógł mi ją zrozumieć:
Powyższy kod zwraca następujące elementy:
źródło
Że istnieje więcej niż tylko
LINQ
doSQL
i funkcje są czymś więcej niż tylkoSQL
parsera wbudowanych w język.źródło
Notacji Big O . LINQ sprawia, że niezwykle proste jest pisanie algorytmów O (n ^ 4) bez zdawania sobie z tego sprawy, jeśli nie wiesz, co robisz.
źródło
Myślę, że fakt, że
Lambda
wyrażenie może zostać rozpoznane zarówno w drzewie wyrażeń, jak i anonimowym uczestniku, możesz więc przekazać to samolambda
wyrażenie deklaratywne zarówno doIEnumerable<T>
metod rozszerzenia, jak iIQueryable<T>
metod rozszerzenia.źródło
Zabrał mnie sposób zbyt długo, aby uświadomić sobie, że wiele metod rozszerzeń LINQ takich jak
Single()
,SingleOrDefault()
etc mieć przeciążeń, które biorą lambdy.Możesz to zrobić :
i nie muszę tego mówić - co jakiś kiepski tutorial przyzwyczaił mnie robić
źródło
Count()
m.in. Czy wiesz, czy jest jakaś różnica w wydajności oprócz oczywistej korzyści z czytelności kodu?W LINQ to SQL ciągle widzę ludzi, którzy nie rozumieją DataContext, jak można go używać i jak należy go używać. Zbyt wiele osób nie widzi obiektu DataContext, ponieważ jest to obiekt jednostki pracy, a nie obiekt trwały.
Widziałem wiele razy, gdy ludzie próbowali singletować DataContext / session it / etc, zamiast tworzyć nowy czas dla każdej operacji.
A potem istnieje usuwanie DataContext przed oceną IQueryable, ale jest to raczej propozycja dla osób, które nie rozumieją IQueryable niż DataContext.
Inną koncepcją, z którą widzę wiele nieporozumień, jest składnia zapytań vs. składnia wyrażeń. Użyję tego, co w tej chwili jest najłatwiejsze, często pozostając przy składni wyrażeń. Wiele osób wciąż nie zdaje sobie sprawy z tego, że ostatecznie wyprodukują to samo, w końcu Query jest kompilowane w Expression.
źródło
Myślę część niezrozumiany LINQ to, że jest to rozszerzenie języka , a nie rozszerzenie bazy danych lub konstrukt.
LINQ
jest o wiele więcej niżLINQ to SQL
.Teraz, gdy większość z nas korzysta
LINQ
z kolekcji, NIGDY nie wrócimy!LINQ
jest najważniejszą cechą .NET od Generics w 2.0 i Anonimowych typów w 3.0.A teraz, kiedy mamy Lambdę, nie mogę się doczekać programowania równoległego!
źródło
Na przykład chciałbym wiedzieć, czy muszę wiedzieć, jakie są drzewa wyrażeń i dlaczego.
źródło
Jestem dość nowy w LINQ. Oto rzeczy, na które natknąłem się podczas mojej pierwszej próby
źródło
Coś, czego początkowo nie zdawałem sobie sprawy, to to, że składnia LINQ nie wymaga
IEnumerable<T>
aniIQueryable<T>
nie działa, LINQ polega tylko na dopasowaniu wzorców.alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
Oto odpowiedź (nie, nie napisałem tego bloga, zrobił to Bart De Smet i jest on jednym z najlepszych blogerów na LINQ, jaki znalazłem).
źródło
Nadal mam problemy z poleceniem „let” (dla którego nigdy nie znalazłem zastosowania) i SelectMany (którego użyłem, ale nie jestem pewien, czy zrobiłem to dobrze)
źródło
Zrozumienie, kiedy przecieka abstrakcja wśród dostawców Linq. Niektóre rzeczy działają na obiektach, ale nie na SQL (np. .TakeWhile). Niektóre metody mogą zostać przetłumaczone na SQL (ToUpper), podczas gdy inne nie. Niektóre techniki są bardziej wydajne w obiektach, w których inne są bardziej skuteczne w SQL (różne metody łączenia).
źródło
Kilka rzeczy.
źródło
OK, z powodu popytu napisałem niektóre rzeczy z Expression. Nie jestem w 100% zadowolony z tego, jak blogger i LiveWriter spiskowali, aby go sformatować, ale na razie wystarczy ...
W każdym razie, proszę bardzo ... Chciałbym uzyskać wszelkie informacje zwrotne, szczególnie jeśli są obszary, w których ludzie chcą więcej informacji.
Oto jest , lubię to lub nienawidzę ...
źródło
Niektóre komunikaty o błędach, szczególnie od LINQ do SQL, mogą być dość mylące. szeroki uśmiech
Odgryzła mnie odroczona egzekucja kilka razy, jak wszyscy inni. Myślę, że najbardziej mylącą rzeczą był dla mnie SQL Server Query Provider i co możesz, a czego nie możesz zrobić.
Nadal jestem zdumiony faktem, że nie można wykonać Sum () na kolumnie dziesiętnej / pieniężnej, która czasami jest pusta. Korzystanie z DefaultIfEmpty () po prostu nie działa. :(
źródło
Myślę, że świetną rzeczą do omówienia w LINQ jest to, jak możesz wpakować się w problemy z wydajnością. Na przykład użycie licznika LINQ jako warunku pętli jest naprawdę, naprawdę nie jest mądre.
źródło
To IQueryable akceptuje oba,
Expression<Func<T1, T2, T3, ...>>
iFunc<T1, T2, T3, ...>
bez wskazania spadku wydajności w drugim przypadku.Oto przykład kodu, który pokazuje, co mam na myśli:
źródło
Nie wiem, czy można to uznać za niezrozumiane - ale dla mnie po prostu nieznane.
Z przyjemnością dowiedziałem się o DataLoadOptions i jak mogę kontrolować, które tabele są połączone, kiedy wykonuję określone zapytanie.
Zobacz tutaj, aby uzyskać więcej informacji: MSDN: DataLoadOptions
źródło
Powiedziałbym, że najbardziej niezrozumianym (a może nie należy tego rozumieć?) Aspektem LINQ są IQueryable i niestandardowi dostawcy LINQ .
Od jakiegoś czasu korzystam z LINQ i czuję się całkowicie swobodnie w świecie IENumerable i mogę rozwiązać większość problemów z LINQ.
Ale kiedy zacząłem przeglądać i czytać o IQueryable oraz wyrażeniach i niestandardowych dostawcach linq, to sprawiło, że zacząłem kręcić głową. Zobacz, jak działa LINQ to SQL, jeśli chcesz zobaczyć dość złożoną logikę.
Nie mogę się doczekać, aby zrozumieć ten aspekt LINQ ...
źródło
Jak większość ludzi powiedziała, myślę, że najbardziej źle rozumiane jest założenie, że LINQ jest tylko zamiennikiem T-SQL. Mój menedżer, który uważa się za guru TSQL, nie pozwoli nam używać LINQ w naszym projekcie, a nawet nienawidzi MS za wydanie takiej rzeczy !!!
źródło
Co reprezentuje var, gdy zapytanie jest wykonywane?
Jest to
iQueryable
,iSingleResult
,iMultipleResult
, lub nie zmienia w zależności od implementacji. Istnieją pewne spekulacje na temat używania (jak się wydaje) pisania dynamicznego w porównaniu do standardowego pisania statycznego w języku C #.źródło
Jak łatwo jest zagnieździć pętlę, nie sądzę, że wszyscy ją rozumieją.
Na przykład:
źródło
group by
wciąż kręci mi się w głowie.Wszelkie nieporozumienia związane z odroczonym wykonywaniem powinny być rozwiązane przez przejście przez prosty kod oparty na LINQ i zabawę w oknie zegarka.
źródło
Skompilowane zapytania
Fakt, że nie można łączyć w łańcuch,
IQueryable
ponieważ są to wywołania metod (chociaż wciąż jest to tylko język SQL możliwy do przetłumaczenia!) I że jest prawie niemożliwe obejście tego, jest oszałamiający i powoduje ogromne naruszenie DRY. Potrzebuję moichIQueryable
ad-hoc, w których nie mam skompilowanych zapytań (mam tylko skompilowane zapytania dla ciężkich scenariuszy), ale w skompilowanych zapytaniach nie mogę ich użyć i zamiast tego muszę ponownie napisać regularną składnię zapytań. Teraz robię te same podkwerendy w 2 miejscach, muszę pamiętać, aby zaktualizować oba, jeśli coś się zmieni, i tak dalej. Koszmar.źródło
Myślę, że # 1 nieporozumieniem na temat LINQ na SQL polega na tym, że MUSISZ WIEDZIEĆ o SQL, aby skutecznie z niego korzystać.
Kolejną niezrozumianą rzeczą dotyczącą Linq dla Sql jest to, że wciąż musisz obniżyć bezpieczeństwo bazy danych do absurdu, aby działało.
Trzecią kwestią jest to, że użycie Linq do Sql wraz z klasami Dynamic (co oznacza, że definicja klasy jest tworzona w czasie wykonywania) powoduje ogromną ilość kompilacji just-in-time. Co może całkowicie zabić wydajność.
źródło
Powolne ładowanie.
źródło
Jak wspomniano, leniwe ładowanie i odroczenie wykonania
Czym LINQ do obiektów i LINQ do XML (IEnumerable) różnią się od LINQ do SQL (IQueryable)
JAK zbudować warstwę dostępu do danych, warstwę biznesową i warstwę prezentacji za pomocą LINQ na wszystkich warstwach ... i dobry przykład.
źródło
Jak większość ludzi powiedziała, myślę, że najbardziej źle rozumiane jest założenie, że LINQ jest tylko zamiennikiem T-SQL. Mój menedżer, który uważa się za guru TSQL, nie pozwoliłby nam użyć LINQ w naszym projekcie, a nawet nienawidzi MS za wydanie takiej rzeczy !!!
źródło
Transakcje (bez użycia TransactionScope)
źródło