Hintergrund: Im nächsten Monat werde ich drei Vorträge über oder zumindest LINQ
im 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 LINQ
auf SQL
das 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 )
Antworten:
Verzögerte Ausführung
quelle
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:
Der obige Code gibt Folgendes zurück:
quelle
Dass es mehr als nur
LINQ
zu gibtSQL
und die Funktionen mehr als nur einSQL
in die Sprache eingebetteter Parser sind.quelle
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.
quelle
Ich denke, die Tatsache, dass ein
Lambda
Ausdruck sowohl in einen Ausdrucksbaum als auch in einen anonymen Delegaten aufgelöst werden kann, sodass Sie denselben deklarativenlambda
Ausdruck sowohl anIEnumerable<T>
Erweiterungsmethoden als auch anIQueryable<T>
Erweiterungsmethoden übergeben können.quelle
Habe mich Weg zu lange zu erkennen , dass viele LINQ - Erweiterungsmethoden wie
Single()
,SingleOrDefault()
etc Überlastungen, die Lambda - Ausdrücke nehmen.Du kannst tun :
und ich muss das nicht sagen - was mich ein schlechtes Tutorial zur Gewohnheit gemacht hat
quelle
Count()
unter anderem auch für. Wissen Sie, ob es zusätzlich zum offensichtlichen Vorteil der Lesbarkeit von Code Leistungsunterschiede gibt?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.
quelle
Ich denke, der missverstandene Teil von LINQ ist, dass es sich um eine Spracherweiterung handelt , nicht um eine Datenbankerweiterung oder ein Konstrukt.
LINQ
ist so viel mehr alsLINQ to SQL
.Jetzt, da die meisten von uns
LINQ
Sammlungen 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!
quelle
Ich würde sicher gerne wissen, ob ich wissen muss, was Ausdrucksbäume sind und warum.
quelle
Ich bin ziemlich neu bei LINQ. Hier sind die Dinge, über die ich bei meinem ersten Versuch gestolpert bin
quelle
Was mir ursprünglich nicht klar war, war, dass die LINQ-Syntax nicht benötigt
IEnumerable<T>
oderIQueryable<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).
quelle
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).
quelle
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).
quelle
Ein paar Dinge.
quelle
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 ...
quelle
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. :((
quelle
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.
quelle
Dieser IQueryable akzeptiert beides
Expression<Func<T1, T2, T3, ...>>
undFunc<T1, T2, T3, ...>
ohne einen Hinweis auf eine Leistungsverschlechterung im zweiten Fall zu geben.Hier ist ein Codebeispiel, das zeigt, was ich meine:
quelle
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
quelle
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 ...
quelle
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 !!!
quelle
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 #.quelle
Wie einfach es ist, eine Schleife zu verschachteln, glaube ich nicht, dass jeder versteht.
Beispielsweise:
quelle
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.
quelle
Kompilierte Abfragen
Die Tatsache, dass Sie nicht verketten können,
IQueryable
weil 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 meineIQueryable
fü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.quelle
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.
quelle
Faules Laden.
quelle
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.
quelle
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 !!!
quelle
Transaktionen (ohne Verwendung von TransactionScope)
quelle