Was ist der schwierigste oder am meisten missverstandene Aspekt von LINQ? [geschlossen]

282

Hintergrund: Im nächsten Monat werde ich drei Vorträge über oder zumindest LINQim Zusammenhang mit halten C#. Ich würde gerne wissen, welchen Themen es wert ist, ein angemessenes Maß an Aufmerksamkeit zu widmen, basierend darauf, was Menschen möglicherweise schwer zu verstehen finden oder wovon sie einen falschen Eindruck haben. Ich werde nicht speziell LINQauf SQLdas Entity Framework eingehen, außer als Beispiele dafür, wie Abfragen mithilfe von Ausdrucksbäumen (und normalerweise IQueryable) remote ausgeführt werden können .

Also, was hast du schwer gefunden LINQ? Was haben Sie in Bezug auf Missverständnisse gesehen? Beispiele könnten eines der folgenden sein, aber bitte beschränken Sie sich nicht!

  • Wie der C#Compiler Abfrageausdrücke behandelt
  • Lambda-Ausdrücke
  • Ausdrucksbäume
  • Erweiterungsmethoden
  • Anonyme Typen
  • IQueryable
  • Aufgeschobene oder sofortige Ausführung
  • Streaming vs gepufferte Ausführung (z. B. OrderBy wird zurückgestellt, aber gepuffert)
  • Implizit typisierte lokale Variablen
  • Lesen komplexer generischer Signaturen (z. B. Enumerable.Join )
Jon Skeet
quelle
3
Es würde mich interessieren, wann Sie diese Gespräche führen und ob es eine Möglichkeit gibt, sie online anzuzeigen
Mark Heath,
2
Erstes Gespräch: Kopenhagen, 30. Oktober. Hoffentlich wird dies aufgezeichnet. (Ganzer Tag!) Zweiter Vortrag: London, 19. November abends, London .NET Users Group, wahrscheinlich auf Push LINQ. Dritter Vortrag: Lesen, 22. November, Developer Developer Day, Implementierung von LINQ für Objekte in 60 Minuten.
Jon Skeet
1
Downvoters: Bitte fügen Sie einen erläuternden Kommentar hinzu.
Jon Skeet
2
@ Jon, Entschuldigung, aber ich muss das schließen.
Tim Post
3
@ Tim: Fair genug - es gab sowieso keine Antworten mehr. Ich persönlich denke , es hat am Ende konstruktiv zu sein, wohlgemerkt - Ich fand es sicherlich nützlich , um zu sehen , was die Leute heikel finden. Ich hätte es jetzt wahrscheinlich nicht gefragt ...
Jon Skeet

Antworten:

271

Verzögerte Ausführung

JaredPar
quelle
12
Richtig - dies ist eindeutig der Favorit unter den Lesern, was für diese Frage das Wichtigste ist. Ich werde dem Mix auch "Buffering vs Streaming" hinzufügen, da dies eng miteinander verbunden ist - und oft nicht so ausführlich besprochen wird, wie ich es gerne in Büchern sehen würde.
Jon Skeet
10
"Ja wirklich?" Ich hatte so oft beim Lernen von Linq darauf hingewiesen, dass es faul ist, dass es für mich nie ein Problem war.
Adam Lassek
26
Stimmen Sie mit ALassek überein. In der MSDN-Dokumentation wird der verzögerte Bewertungscharakter von LINQ klar angegeben. Vielleicht ist das eigentliche Problem die faule Programmierung der Entwickler ... =)
Seiti
4
... vor allem, wenn Sie feststellen, dass dies für LINQ für Objekte und nicht nur für LINQ 2 SQL gilt - wenn Sie 10 Webmethodenaufrufe zum Abrufen einer Liste von Elementen sehen, wenn Sie bereits dieselbe Liste von Elementen auflisten und das gedacht haben Liste wurde bereits ausgewertet
Simon_Weaver
5
Zu wissen, was die Ertragsaussage ist und wie sie funktioniert, ist meiner Meinung nach entscheidend für ein gründliches Verständnis von LINQ.
PeSHIr
125

Ich weiß, dass das Konzept der verzögerten Ausführung inzwischen in mich hineingeschlagen werden sollte, aber dieses Beispiel hat mir wirklich geholfen, es in die Praxis umzusetzen:

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);
    }
}

Der obige Code gibt Folgendes zurück:

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory
DSO
quelle
2
blogs.msdn.com/b/charlie/archive/2007/12/09/… <- Ich denke, dies ist meiner Meinung nach der beste Blog, um dies zu erklären. (weit weg von 2007, kann nicht glauben, dass es schon so lange her ist)
Phill
104

Dass es mehr als nur LINQzu gibt SQLund die Funktionen mehr als nur ein SQLin die Sprache eingebetteter Parser sind.

smaclell
quelle
6
Ich habe es
satt,
40
Nicht jeder tut es! Ich weiß immer noch nicht, was LINQ to SQL ist, und ich benutze LINQ die ganze verdammte Zeit.
Robert Rossney
2
Ich ärgere mich so sehr, wenn ich versuche, etwas mit LINQ zu erklären, und die andere Person sieht mich nur an und sagt: "Ohhh, ich benutze LINQ nicht für so etwas, nur für SQL" :(
Nathan W
13
Einverstanden scheinen viele Menschen nicht zu verstehen, dass LINQ ein Allzweckwerkzeug ist.
Matthew Olenik
86

Big O-Notation . Mit LINQ ist es unglaublich einfach, O (n ^ 4) -Algorithmen zu schreiben, ohne es zu merken, wenn Sie nicht wissen, was Sie tun.

erikkallen
quelle
16
Wie wäre es mit einem Beispiel?
Hughdbrown
4
Als Beispiel meint er vielleicht die Tatsache, dass es sehr einfach ist, dass eine Select-Klausel viele Sum () -Operatoren enthält, von denen jeder einen weiteren Durchlauf über das gesamte Recordset verursacht.
Rob Packwood
1
In der Tat könnte es sich sogar lohnen, durchzugehen, was große O-Notation ist und warum sie wichtig ist, sowie einige Beispiele für ineffiziente resultierende Abfragen. Ich denke, das war es, was das Originalplakat vorschlug, aber ich dachte, ich würde es trotzdem erwähnen. - EDIT: habe gerade festgestellt, dass dieser Beitrag 1,5 Jahre alt war :-)
zcrar70
7
Das wäre nicht O (n ^ x), das wäre O (xn), das ist nur O (n).
Malfist
3
Der Versuch, eine Verknüpfung ohne den Verknüpfungsoperator durchzuführen, führt zu O (n ^ x): von i1 in Bereich1 von i2 in Bereich2 von i3 in Bereich3 von i4 in Bereich4 wobei i1 == i2 && i3 == i4 neues {i1, auswählen i2, i3, i4}. Und ich habe das schon einmal geschrieben gesehen. Es funktioniert, aber sehr langsam.
MarkPflug
55

Ich denke, die Tatsache, dass ein LambdaAusdruck sowohl in einen Ausdrucksbaum als auch in einen anonymen Delegaten aufgelöst werden kann, sodass Sie denselben deklarativen lambdaAusdruck sowohl an IEnumerable<T>Erweiterungsmethoden als auch an IQueryable<T>Erweiterungsmethoden übergeben können.

Tim Jarvis
quelle
2
Einverstanden. Ich bin ein Veteran und habe gerade festgestellt, dass dieses implizite Casting stattfindet, als ich anfing, meinen eigenen QueryProvider
TheSoftwareJedi
53

Habe mich Weg zu lange zu erkennen , dass viele LINQ - Erweiterungsmethoden wie Single(), SingleOrDefault()etc Überlastungen, die Lambda - Ausdrücke nehmen.

Du kannst tun :

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

und ich muss das nicht sagen - was mich ein schlechtes Tutorial zur Gewohnheit gemacht hat

Where(x => x.id == id).Single()
Simon_Weaver
quelle
+1, sehr schön. Ich merke es mir.
Brezel
4
Ich vergesse das auch immer wieder. Dies gilt Count()unter anderem auch für. Wissen Sie, ob es zusätzlich zum offensichtlichen Vorteil der Lesbarkeit von Code Leistungsunterschiede gibt?
Justin Morgan
1
An der Universität wollte mein Dozent Punkte für die Nutzung dieser Überlastungen abheben !! Ich habe ihm das Gegenteil bewiesen!
TDaver
12
Es mag seltsam klingen, aber ich bevorzuge die zweite Syntax. Ich finde es besser lesbar.
Konamiman
40

In LINQ to SQL sehe ich ständig Leute, die den DataContext nicht verstehen, wie er verwendet werden kann und wie er verwendet werden sollte. Zu viele Leute sehen den DataContext nicht als das, was er ist, als Unit of Work-Objekt, nicht als dauerhaftes Objekt.

Ich habe viele Male gesehen, in denen Leute versuchen, einen DataContext / eine Sitzung / etc zu singleton, anstatt für jede Operation eine neue Zeit festzulegen.

Und dann wird der DataContext entsorgt, bevor der IQueryable ausgewertet wurde, aber das ist eher ein Problem, wenn Leute IQueryable nicht verstehen als den DataContext.

Das andere Konzept, mit dem ich viel Verwirrung sehe, ist die Abfragesyntax im Vergleich zur Ausdruckssyntax. Ich werde das verwenden, was an diesem Punkt am einfachsten ist, und mich oft an die Ausdruckssyntax halten. Viele Leute wissen immer noch nicht, dass sie am Ende dasselbe produzieren werden. Query wird schließlich zu Expression kompiliert.

Aaron Powell
quelle
2
Warnung: Die Arbeitseinheit kann ein kleines Programm mit dem Datenkontext als Singleton sein.
Graffic
15
Sie sollten den DataContext nicht in einem Singleton verwenden, er ist nicht threadsicher.
Aaron Powell
3
@Slace, nicht alle Programme sind mehrköpfig, daher ist es in Ordnung, den DataContext als Singleton in einer Menge "Desktop" -Software zu haben
Ian Ringrose,
2
Ich wurde davon gebissen (mit DataContext als Singleton), als ich mein erstes LINQ to SQL-Projekt durchführte. Ich denke nicht, dass die Dokumentation und die Bücher dies offensichtlich genug machen. Eigentlich denke ich, dass der Name verbessert werden könnte, aber ich bin mir nicht sicher, wie.
Roger Lipscombe
1
Es dauerte mehrere Male, bis ich ScottGus Artikel auf Linq gelesen hatte, um dies in meinen Kopf zu bekommen.
Evan Plaice
34

Ich denke, der missverstandene Teil von LINQ ist, dass es sich um eine Spracherweiterung handelt , nicht um eine Datenbankerweiterung oder ein Konstrukt.

LINQist so viel mehr als LINQ to SQL.

Jetzt, da die meisten von uns LINQSammlungen verwendet haben, werden wir NIEMALS zurückkehren!

LINQ ist die wichtigste Funktion für .NET seit Generics in 2.0 und Anonymous Types in 3.0.

Und jetzt, wo wir Lambdas haben, kann ich es kaum erwarten, parallel zu programmieren!

Chris
quelle
Ich würde es sogar bedeutender nennen als anonyme Typen und möglicherweise sogar mehr als Generika.
Justin Morgan
26

Ich würde sicher gerne wissen, ob ich wissen muss, was Ausdrucksbäume sind und warum.

Robert Rossney
quelle
6
Ich denke, es lohnt sich zu wissen, was Ausdrucksbäume sind und warum sie existieren, aber nicht die Details, wie man sie selbst baut. (Es ist schwierig, sie von Hand zu erstellen, aber der Compiler wird beim Konvertieren eines Lambda-Ausdrucks hervorragende Arbeit leisten.)
Jon Skeet
3
Eigentlich habe ich darüber nachgedacht, ein paar Blogeinträge für Ausdrucksbäume zu machen (da ich sie "bekomme"). Ich finde es sehr nützlich, Ausdrucksbäume zu manipulieren ...
Marc Gravell
Ich denke jedoch nicht, dass sie für Jons Vortrag (e) hilfreich sind ;-p
Marc Gravell
3
Ich mache mir nur Sorgen, dass Ausdrucksbäume wie die Ertragsaussage sein werden: etwas, das sich als unglaublich wertvoll herausstellte, obwohl ich zunächst nicht verstand, wofür es war.
Robert Rossney
1
Marc Gravell Ich würde gerne Ihre Blogeinträge zu diesem Thema lesen. Ich freue mich darauf
Alexandre Brisebois
20

Ich bin ziemlich neu bei LINQ. Hier sind die Dinge, über die ich bei meinem ersten Versuch gestolpert bin

  • Mehrere Abfragen zu einer kombinieren
  • Effektives Debuggen von LINQ-Abfragen in Visual Studio.
Mark Heath
quelle
21
Das Debuggen von LINQ ist ein Thema für sich und ein wichtiges. Ich denke, die größte Schwäche von LINQ ist, dass Sie damit Blöcke beliebig komplexer Logik schreiben können, durch die Sie nicht treten können.
Robert Rossney
3
Dies kann ein guter Ort sein, um LINQ Pad zu verwenden
Maslow
2
Stimme herzlich zu; Aus diesem Grund habe ich LINQ Secrets Revealed: Chaining and Debugging geschrieben , das gerade auf Simple-Talk.com veröffentlicht wurde und möglicherweise Unterstützung bietet.
Michael Sorens
Ja, LinqPad ist ein großartiges sekundäres Tool zum Entwickeln Ihrer LINQ-Abfragen. Besonders zu Beginn und wenn Sie mit den Konventionen / Mustern noch nicht vertraut sind.
Buffalo
20

Was mir ursprünglich nicht klar war, war, dass die LINQ-Syntax nicht benötigt IEnumerable<T>oder IQueryable<T>funktioniert. Bei LINQ geht es nur um Mustervergleich.

Alternativtext http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

Hier ist die Antwort (nein, ich habe diesen Blog nicht geschrieben, Bart De Smet, und er ist einer der besten Blogger auf LINQ, die ich gefunden habe).

Aaron Powell
quelle
1
Vielleicht finden Sie diesen Blog-Beitrag auch interessant: msmvps.com/blogs/jon_skeet/archive/2008/02/29/…
Jon Skeet
Netter Beitrag Jon (Ich abonniere Ihren Blog, allerdings erst vor kurzem).
Aaron Powell
19

Ich habe immer noch Probleme mit dem Befehl "let" (für den ich nie eine Verwendung gefunden habe) und SelectMany (den ich verwendet habe, aber ich bin nicht sicher, ob ich es richtig gemacht habe).

James Curran
quelle
2
Jedes Mal, wenn Sie eine Variable einführen möchten, verwenden Sie eine let-Anweisung. Stellen Sie sich eine herkömmliche Schleife vor, in der Sie Variablen einführen und jeder Variablen einen Namen geben, um die Lesbarkeit des Codes zu verbessern. Manchmal ist es auch schön, wenn Sie eine let-Anweisung haben, die ein Funktionsergebnis auswertet, das Sie dann auswählen und nach on sortieren können, ohne das Ergebnis zweimal auswerten zu müssen.
Rob Packwood
Mit 'let' können Sie zusammengesetzte Typen erstellen. Handliches Zeug.
Phill
19

Verstehen, wann die Abstraktion zwischen Linq-Anbietern leckt. Einige Dinge funktionieren mit Objekten, aber nicht mit SQL (z. B. .TakeWhile). Einige Methoden können in SQL (ToUpper) übersetzt werden, andere nicht. Einige Techniken sind in Objekten effizienter, während andere in SQL effektiver sind (verschiedene Verknüpfungsmethoden).

Denis Phillips
quelle
1
Dies ist ein sehr guter Punkt. Es hilft nicht, dass Intellisense Ihnen ALLE zeigt und normalerweise sogar kompiliert. Dann sprengst du zur Laufzeit. Ich hoffe, dass VS 2010 relevante Erweiterungsmethoden besser zeigt.
Jason Short
12

Ein paar Dinge.

  1. Leute, die Linq als Linq to SQL betrachten.
  2. Einige Leute denken, dass sie anfangen können, alle foreach / Logik durch Linq-Abfragen zu ersetzen, ohne diese Auswirkungen auf die Leistung zu berücksichtigen.
Krishna Kumar
quelle
11

OK, aufgrund der Nachfrage habe ich einige der Expression-Sachen geschrieben. Ich bin nicht 100% zufrieden damit, wie sich Blogger und LiveWriter zum Formatieren verschworen haben, aber es wird vorerst reichen ...

Wie auch immer, hier geht's ... Ich würde mich über Feedback freuen, besonders wenn es Bereiche gibt, in denen die Leute mehr Informationen wünschen.

Hier ist es , mag es oder hasse es ...

Marc Gravell
quelle
10

Einige der Fehlermeldungen, insbesondere von LINQ zu SQL, können ziemlich verwirrend sein. Grinsen

Ich bin ein paar Mal wie alle anderen von der aufgeschobenen Hinrichtung gebissen worden. Ich denke, das Verwirrendste für mich war der SQL Server-Abfrageanbieter und was Sie damit machen können und was nicht.

Ich bin immer noch erstaunt darüber, dass Sie für eine manchmal leere Dezimal- / Geldspalte keine Summe () erstellen können. Die Verwendung von DefaultIfEmpty () funktioniert einfach nicht. :((

Per Erik Stendahl
quelle
1
Es sollte einfach sein, ein Wo auf diese Abfrage zu setzen, damit die Summe funktioniert
Esben Skov Pedersen
9

Ich denke, eine großartige Sache, die in LINQ behandelt werden muss, ist, wie Sie sich in Bezug auf die Leistung in Schwierigkeiten bringen können. Zum Beispiel ist es wirklich, wirklich nicht klug, die Anzahl von LINQ als Schleifenbedingung zu verwenden.

Steve
quelle
7

Dieser IQueryable akzeptiert beides Expression<Func<T1, T2, T3, ...>>und Func<T1, T2, T3, ...>ohne einen Hinweis auf eine Leistungsverschlechterung im zweiten Fall zu geben.

Hier ist ein Codebeispiel, das zeigt, was ich meine:

[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);
}
Valera Kolupaev
quelle
Können Sie erklären? Ich folge nicht ...
Brezel
@Pretzel Ich habe ein Codebeispiel hinzugefügt, das mein Problem demonstriert.
Valera Kolupaev
Danke für das Codebeispiel! Sehr hilfreich.
Buffalo
6

Ich weiß nicht, ob es als missverstanden gilt - aber für mich einfach unbekannt.

Ich war erfreut zu erfahren, wie DataLoadOptions funktioniert und wie ich steuern kann, welche Tabellen bei einer bestimmten Abfrage verknüpft werden.

Weitere Informationen finden Sie hier: MSDN: DataLoadOptions

Martin
quelle
6

Ich würde sagen, der am meisten missverstandene (oder sollte das nicht verstanden werden?) Aspekt von LINQ sind IQueryable und benutzerdefinierte LINQ-Anbieter .

Ich benutze LINQ jetzt schon eine Weile und fühle mich in der IEnumerable-Welt rundum wohl und kann die meisten Probleme mit LINQ lösen.

Aber als ich anfing, mir IQueryable und Expressions und benutzerdefinierte Linq-Anbieter anzuschauen und darüber zu lesen, drehte sich mein Kopf. Schauen Sie sich an, wie LINQ to SQL funktioniert, wenn Sie eine ziemlich komplexe Logik sehen möchten.

Ich freue mich darauf, diesen Aspekt von LINQ zu verstehen ...

Jack Ukleja
quelle
6

Wie die meisten Leute sagten, denke ich, dass der am meisten missverstandene Teil darin besteht, anzunehmen, dass LINQ nur ein Ersatz für T-SQL ist. Mein Manager, hält sich als TSQL Guru würde uns verwenden LINQ in unserem Projekt nicht lassen und sogar hasst MS für die Freigabe so etwas !!!

HashName
quelle
Zu viele Leute verwenden es als Ersatz für TSQL. Die meisten von ihnen haben noch nie von einem Hinrichtungsplan gehört.
Erikkallen
+1, weil ich Ihrem Manager zustimme, zumindest insofern, als LINQ in jedem Projekt SQL zulässt. LINQ to Objects ist eine ganz andere Sache.
NotMe
5

Was bedeutet var, wenn eine Abfrage ausgeführt wird?

Ist es iQueryable, iSingleResult, iMultipleResult, oder ändert es sich auf der der Umsetzung basiert. Es gibt einige Spekulationen über die Verwendung von (scheinbar) dynamischer Typisierung im Vergleich zur standardmäßigen statischen Typisierung in C #.

Benutzer31939
quelle
AFAIK var ist immer die fragliche konkrete Klasse (auch wenn es sich um einen anonymen Typ handelt), daher ist es niemals IQueryable, ISingleResult oder irgendetwas, das mit 'I' beginnt (konkrete Klassen, die mit 'I' beginnen, müssen nicht zutreffen).
Motti
5

Wie einfach es ist, eine Schleife zu verschachteln, glaube ich nicht, dass jeder versteht.

Beispielsweise:

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem
Rob Packwood
quelle
+1, whoa. das ist ziemlich mächtig.
Brezel
4

group by lässt meinen Kopf immer noch drehen.

Jegliche Verwirrung über die verzögerte Ausführung sollte behoben werden können, indem Sie einen einfachen LINQ-basierten Code durchgehen und im Überwachungsfenster herumspielen.

Richard Ev
quelle
1
Ich habe festgestellt, dass die Implementierung von ziemlich viel LINQ in Objects zum Spaß wirklich hilft :) Aber ja, es ist ein bisschen verwirrend - sicherlich, wenn ich eine Weile keinen LINQ mehr gemacht habe, muss ich zu den Signaturen zurückkehren. Ebenso bringt mich "Join" vs "Join In" oft ...
Jon Skeet
4

Kompilierte Abfragen

Die Tatsache, dass Sie nicht verketten können, IQueryableweil es sich um Methodenaufrufe handelt (obwohl immer noch nichts anderes als SQL übersetzbar ist!) Und dass es fast unmöglich ist, dies zu umgehen, ist umwerfend und führt zu einer großen Verletzung von DRY. Ich benötige meine IQueryablefür Ad-hoc-Abfragen, bei denen ich keine kompilierten Abfragen habe (ich habe nur Abfragen für die schweren Szenarien kompiliert), aber bei kompilierten Abfragen kann ich sie nicht verwenden und muss stattdessen erneut die reguläre Abfragesyntax schreiben. Jetzt mache ich die gleichen Unterabfragen an zwei Stellen, muss daran denken, beide zu aktualisieren, wenn sich etwas ändert, und so weiter. Ein Albtraum.

Alex
quelle
4

Ich denke, das größte Missverständnis über LINQ to SQL ist, dass Sie SQL immer noch kennen müssen, um es effektiv nutzen zu können.

Ein weiteres Missverständnis von Linq to Sql ist, dass Sie Ihre Datenbanksicherheit immer noch bis zur Absurdität senken müssen, damit sie funktioniert.

Ein dritter Punkt ist, dass die Verwendung von Linq to Sql zusammen mit dynamischen Klassen (dh die Klassendefinition wird zur Laufzeit erstellt) eine enorme Menge an Just-in-Time-Kompilierung verursacht. Welches kann Leistung absolut töten.

Nicht ich
quelle
4
Es ist jedoch sehr vorteilhaft, SQL bereits zu kennen. Einige SQL-Anweisungen, die von Linq an SQL (und andere ORMs) gesendet werden, können geradezu zweifelhaft sein, und die Kenntnis von SQL hilft bei der Diagnose solcher Probleme. Außerdem kann Linq to SQL gespeicherte Prozeduren verwenden.
Robert Harvey
2

Wie bereits erwähnt, verzögertes Laden und verzögerte Ausführung

Wie sich LINQ to Objects und LINQ to XML (IEnumerable) von LINQ to SQL (IQueryable) unterscheiden

So erstellen Sie eine Datenzugriffsschicht, eine Geschäftsschicht und eine Präsentationsschicht mit LINQ in allen Schichten ... und ein gutes Beispiel.

Aschemaschine
quelle
Die ersten beiden kann ich machen. Ich würde noch nicht gerne versuchen, den dritten in dem Sinne zu machen, dass dies der richtige Weg ist ...
Jon Skeet
+1, bis Sie darauf hingewiesen haben, war mir nicht klar, dass LINQ-to-Objects und LINQ-to-XML IEnumerable im Gegensatz zu LINQ-to-SQL als IQueryable sind, aber es macht Sinn. Vielen Dank!
Brezel
2

Wie die meisten Leute sagten, denke ich, dass der am meisten missverstandene Teil darin besteht, anzunehmen, dass LINQ nur ein Ersatz für T-SQL ist. Mein Manager, der sich als TSQL-Guru betrachtet, würde uns LINQ nicht in unserem Projekt verwenden lassen und hasst sogar MS, weil er so etwas veröffentlicht !!!

stackuser1
quelle
2

Transaktionen (ohne Verwendung von TransactionScope)

Naeem Sarfraz
quelle