Jaki jest najtrudniejszy lub najbardziej niezrozumiany aspekt LINQ? [zamknięte]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięte 9 lat temu. zamknięty. To pytanie i jego odpowiedzi są zamknięte , Ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Tło: w ciągu najbliższego miesiąca wygłoszę trzy rozmowy na temat lub przynajmniej w tym LINQ w kontekście C#. Chciałbym wiedzieć, które tematy są warte poświęcenia sporej uwagi, na podstawie tego, co ludzie mogą mieć trudne do zrozumienia lub co mogą mieć mylne wrażenie. Nie będę konkretnie mówił o LINQ do SQL lub encji Framework, chyba że jako przykłady jak zapytania mogą być wykonywane zdalnie przy użyciu drzew wyrażeń (i zazwyczaj IQueryable).

Więc, co masz trudnego w LINQ? Co widziałeś w kategoriach nieporozumień? Przykłady mogą być następujące, ale proszę nie ograniczaj się!

  • jak kompilator C# traktuje wyrażenia zapytania
  • wyrażenia Lambda
  • drzewa ekspresji
  • metody rozszerzenia
  • typy anonimowe
  • IQueryable
  • odroczony vs natychmiastowy wykonanie
  • Realizacja strumieniowa vs buforowana (np. OrderBy jest odroczona, ale buforowana)]}
  • domyślnie wpisywane zmienne lokalne
  • odczyt złożonych podpisów ogólnych (np. Enumerable.Join )
 282
Author: Jon Skeet, 2008-10-18

30 answers

Opóźniona egzekucja

 271
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 21:06:20

Wiem, że koncepcja odroczonego wykonania powinna być już we mnie uderzona, ale ten przykład naprawdę pomógł mi zrozumieć ją w praktyce: {]}

static void Linq_Deferred_Execution_Demo()
{
    List<String> items = new List<string> { "Bob", "Alice", "Trent" };

    var results = from s in items select s;

    Console.WriteLine("Before add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }

    items.Add("Mallory");

    //
    //  Enumerating the results again will return the new item, even
    //  though we did not re-assign the Linq expression to it!
    //

    Console.WriteLine("\nAfter add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }
}

Powyższy kod zwraca:

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory
 125
Author: DSO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-27 20:41:37

Że istnieje coś więcej niż tylko LINQ do SQL, A funkcje są czymś więcej niż tylko parserem SQL osadzonym w języku.

 104
Author: smaclell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 13:52:02

Notacja Big o . LINQ sprawia, że niezwykle łatwo jest pisać algorytmy O (n^4), nie zdając sobie z tego sprawy, jeśli nie wiesz, co robisz.

 86
Author: erikkallen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-20 13:07:25

Myślę, że fakt, że Lambda wyrażenie może rozwiązać zarówno drzewo wyrażeń, jak i anonimowy delegat, więc można przekazać to samo deklaratywne wyrażenie lambda zarówno do metod rozszerzenia IEnumerable<T>, jak i metod rozszerzenia IQueryable<T>.

 55
Author: Tim Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 13:51:18

Zajęło mi sposób zbyt długo, aby uświadomić sobie, że wiele metod rozszerzenia LINQ takich jak Single(), SingleOrDefault() itp mają przeciążenia, które biorą lambda.

Możesz zrobić:

Single(x => x.id == id)

I nie muszę tego mówić - co jakiś zły tutorial sprawił, że mam w zwyczaju robić

Where(x => x.id == id).Single()
 53
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-16 21:21:58

W LINQ do SQL ciągle widzę ludzi nie rozumiejących DataContext, jak można go używać i jak powinien być używany. Zbyt wiele osób nie widzi DataContext dla tego, co to Jest, jednostka obiektu pracy, a nie obiekt utrzymujący się.

Widziałem wiele razy, gdzie ludzie próbują singleton DataContext / session it / etc zamiast podejmowania nowy czas dla każdej operacji.

A potem jest usuwanie DataContext zanim IQueryable zostanie ocenione ale to bardziej prople z ludźmi nie rozumiejącymi IQueryable niż DataContext.

Innym pojęciem, z którym widzę wiele nieporozumień, jest składnia zapytań a składnia wyrażeń. Użyję tego, co zawsze jest najłatwiejsze w tym momencie, często trzymając się składni wyrażeń. Wiele osób nadal nie zdaje sobie sprawy z tego, że w końcu wyprodukują to samo, zapytanie jest jednak kompilowane do wyrażenia.

 40
Author: Aaron Powell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 00:05:38

Myślę, że źle zrozumianą częścią LINQ jest to, że jest to rozszerzenie językowe , a nie rozszerzenie bazy danych lub konstruowanie.

LINQ to o wiele więcej niż LINQ to SQL.

Teraz, gdy większość z nas używała LINQ Na kolekcjach, nigdy nie wrócimy!

LINQ jest jedną z najważniejszych funkcji dla. NET od Generics w 2.0 i anonimowych typów w 3.0.

A teraz, gdy mamy Lambda, nie mogę się doczekać programowania równoległego!

 34
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-15 17:14:16

Na pewno chciałbym wiedzieć, czy muszę wiedzieć, czym są drzewa ekspresji i dlaczego.

 26
Author: Robert Rossney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 05:52:46

Jestem całkiem nowy w LINQ. Oto rzeczy, o które natknąłem się podczas mojej pierwszej próby

  • Łączenie kilku zapytań w jedno
  • skuteczne debugowanie zapytań LINQ w Visual Studio.
 20
Author: Mark Heath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 17:47:44

Coś, czego początkowo nie zdawałem sobie sprawy było to, że składnia LINQ nie wymaga IEnumerable<T> lub IQueryable<T> do działania, LINQ jest tylko o dopasowanie wzorca.

Alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

Oto odpowiedź (nie, ja nie napisałem tego bloga, zrobił to Bart De Smet i jest jednym z najlepszych blogerów na LINQ, jakiego znalazłem).

 20
Author: Aaron Powell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-09 06:46:18

Nadal mam problem z poleceniem " let " (do którego nigdy nie znalazłem zastosowania) i SelectMany (którego używałem, ale nie jestem pewien, czy zrobiłem to dobrze)

 19
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 23:26:22

Zrozumienie, kiedy abstrakcja między dostawcami Linq przecieka. Niektóre rzeczy działają na obiektach, ale nie na SQL (np.,.TakeWhile). Niektóre metody mogą zostać przetłumaczone na język SQL (ToUpper), podczas gdy inne nie. niektóre techniki są bardziej efektywne w obiektach, gdzie inne są bardziej efektywne w SQL (różne metody łączenia).

 19
Author: denis phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 00:53:25

Kilka rzeczy.

  1. ludzie myślą o Linq jako Linq do SQL.
  2. Niektórzy uważają, że mogą zacząć zastępować wszystkie foreach/logic zapytaniami Linq bez uwzględniania tego wpływu na wydajność.
 12
Author: Krishna Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 06:23:15

OK, ze względu na zapotrzebowanie, napisałem kilka rzeczy o wyrażeniu. Nie jestem w 100% zadowolony z tego, jak bloger i LiveWriter spiskowali, aby go sformatować, ale na razie wystarczy...

W każdym razie, zaczyna się... Chciałbym uzyskać wszelkie opinie, zwłaszcza jeśli są obszary, w których ludzie chcą więcej informacji.

Tutaj jest , podoba lub nienawidzę...

 11
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 09:08:48

Niektóre komunikaty o błędach, zwłaszcza z LINQ do SQL, mogą być dość mylące. grin

Zostałem ugryziony przez odroczoną egzekucję kilka razy, jak wszyscy inni. Myślę, że najbardziej mylącą rzeczą dla mnie był dostawca zapytań SQL Server i to, co możesz, a czego nie możesz z nim zrobić.

Nadal jestem zdumiony faktem, że nie można zrobić Sum () na kolumnie dziesiętnej / money, która jest czasami pusta. Użycie DefaultIfEmpty() po prostu nie zadziała. :(

 10
Author: Per Erik Stendahl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 12:12:37

Myślę, że świetną rzeczą do omówienia w LINQ jest to, jak można się wpakować w kłopoty pod względem wydajności. Na przykład, używanie LINQ ' s count jako warunku pętli jest naprawdę, naprawdę nie mądre.

 9
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-30 15:16:27

Że akceptuję zarówno Expression<Func<T1, T2, T3, ...>>, jak i Func<T1, T2, T3, ...>, bez podpowiedzi o degradacji wydajności w 2. przypadku.

Oto przykład kodu, który pokazuje co mam na myśli:

[TestMethod]
public void QueryComplexityTest()
{
    var users = _dataContext.Users;

    Func<User, bool>                funcSelector =       q => q.UserName.StartsWith("Test");
    Expression<Func<User, bool>>    expressionSelector = q => q.UserName.StartsWith("Test");

    // Returns IEnumerable, and do filtering of data on client-side
    IQueryable<User> func = users.Where(funcSelector).AsQueryable();
    // Returns IQuerible and do filtering of data on server side
    // SELECT ... FROM [dbo].[User] AS [t0] WHERE [t0].[user_name] LIKE @p0
    IQueryable<User> exp = users.Where(expressionSelector);
}
 7
Author: Valera Kolupaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-30 14:22:11

Nie wiem, czy kwalifikuje się to jako niezrozumiane - ale dla mnie po prostu nieznane.

Byłem zadowolony, aby dowiedzieć się o DataLoadOptions i jak Mogę kontrolować, które tabele są połączone, gdy wykonuję konkretne zapytanie.

Zobacz tutaj, aby uzyskać więcej informacji: MSDN: DataLoadOptions

 6
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-15 14:10:46

Powiedziałbym, że najbardziej niezrozumiany (czy powinien być niezrozumiały?) aspect of LINQ is IQueryable and custom LINQ providers .

Używam LINQ już od jakiegoś czasu i jestem w pełni komfortowy w świecie IEnumerable i mogę rozwiązać większość problemów z LINQ.

Ale kiedy zacząłem się przyglądać i czytać o IQueryable, i Expressions i custom LINQ providers zrobiło mi się niedobrze. Zobacz jak działa LINQ do SQL jeśli chcesz zobaczyć jakieś ładne skomplikowana logika.

Czekam na zrozumienie tego aspektu LINQ...

 6
Author: Jack Ukleja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-16 01:30:36

Jak większość ludzi powiedziała, Myślę, że najbardziej niezrozumianą częścią jest założenie, że LINQ jest tylko zamiennikiem dla T-SQL. Mój manager, który uważa siebie za guru TSQL, nie pozwoliłby nam używać LINQ w naszym projekcie, a nawet nienawidzi MS za wypuszczenie czegoś takiego!!!

 6
Author: HashName,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-08 12:45:20

Co reprezentuje var podczas wykonywania zapytania?

Czy to iQueryable, iSingleResult, iMultipleResult, czy też zmienia się w zależności od implementacji. Istnieją pewne spekulacje na temat używania (co wydaje się być) dynamicznego pisania zamiast standardowego pisania statycznego w C#.

 5
Author: user31939,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 13:53:18

Jak łatwo jest zagnieżdżać pętlę, to coś, czego chyba nie wszyscy rozumieją.

Na przykład:

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem
 5
Author: Rob Packwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 22:29:13

group by wciąż kręci mi się w głowie.

Wszelkie nieporozumienia dotycząceodroczonego wykonania powinny być rozwiązane przez przejście przez prosty kod oparty na LINQ i zabawę w oknie obserwacyjnym.

 4
Author: Richard Ev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-26 16:38:32

Skompilowane Zapytania

Fakt, że nie można połączyć IQueryable, ponieważ są to wywołania metod (podczas gdy nadal nic innego, jak SQL translateable!) i że prawie niemożliwe jest obejście tego jest mindbogging i tworzy ogromne naruszenie suchego. Potrzebuję moich IQueryable ' S Do ad-hoc, w którym 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ę napisać zwykłą składnię zapytań ponownie. Teraz robię te same zapytania w 2 miejscach, trzeba pamiętać, aby zaktualizować zarówno jeśli coś się zmieni, i tak dalej. Koszmar.

 4
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Myślę, że # 1 błędne przekonanie o LINQ do SQL jest to, że nadal trzeba znać SQL, aby skutecznie z niego korzystać.

Kolejną niezrozumianą rzeczą w Linq do Sql jest to, że nadal musisz obniżyć bezpieczeństwo bazy danych do absurdu, aby to działało.

Trzecia kwestia polega na tym, że użycie Linq do Sql wraz z dynamicznymi klasami (co oznacza, że definicja klasy jest tworzona w czasie wykonywania) powoduje ogromną ilość kompilacji just-in-time. Które mogą absolutnie Zabij wydajność.

 4
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-30 14:27:53

Leniwe Ładowanie.

 2
Author: Ryan Eastabrook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 21:04:46

Jak już wspomniano, leniwe ładowanie i odroczona realizacja

W związku z tym, że LINQ to Objects i LINQ to 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 we wszystkich warstwach....i dobry przykład.

 2
Author: Ash Machine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-07 17:42:27

Jak większość ludzi powiedziała, Myślę, że najbardziej niezrozumianą częścią jest założenie, że LINQ jest tylko zamiennikiem dla T-SQL. Mój manager, który uważa się za guru TSQL, nie pozwoliłby nam używać LINQ w naszym projekcie, a nawet nienawidzi MS za wypuszczenie czegoś takiego!!!

 2
Author: stackuser1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-31 11:23:15

Transakcje (bez użycia TransactionScope)

 2
Author: Naeem Sarfraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-30 05:37:58