Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

LINQ Grundkurs

Was ist LINQ?

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Hier klärt Hendrik Lösch zunächst, worum es sich bei LINQ handelt, welche Vorteile es hat und wo es überall eingesetzt werden kann.
09:26

Transkript

Bevor wir uns in die Untiefen von LINQ stürzen, sollten wir uns zuerst fragen: Was ist das überhaupt? LINQ ist die Kurzform für Language Integrated Query und beschreibt ein Verfahren, mit dem Mengenabfragen in die Programmiersprachen C# und VB.NET übernommen werden können, beziehungsweise von diesen aus ausgeführt werden können. Eine solche Query beziehungsweise Abfrage kennen sie wahrscheinlich eher von SQL. Dort hat man bestimmte Schlüsselworte wie SELECT, FROM, WHERE, LIKE, ORDERBY und so weiter und so fort, mit denen wir definieren können, wie wir Teilmengen aus Datenmengen extrahieren können. Diese Datenmengen sind dann häufig Tabellen, oder in aller Regel Tabellen. Eine solche Tabelle wäre in meinem Beispiel Persons. Eine Tabelle hat die Eigenschaft, dass alle Daten, die darin enthalten sind, gleich strukturiert sind. Und dann kann man auf diese Struktur Abfragen machen und Einschränkungen vornehmen, wie hier, dass man nur die Personen haben möchte, die Hendrik heißen. Mit LINQ können wir im Grunde das Gleiche machen, bloß dass wir nicht mehr zwangsläufig Daten nur von Tabellen abrufen, sondern wir können auf jede Form von Datenmengen zugreifen. Also dieser Kontext könnte beispielsweise ein Dokument sein, ein XML-Dokument. Oder Persons könnte auch eine generelle Liste von Personenobjekten sein, die wir selbst erzeugen. Der Kreativität sind dabei keine Grenzen gesetzt. Das Besondere an LINQ ist eigentlich bloß, dass wir zuerst diese Schlüsselworte haben, also from, in, where, select, die sehr deutlich an SQL erinnern. Aber es ist auch die Optimierung, die im Hintergrund läuft. Denn die Abfragen, die wir definieren, werden automatisch von LINQ optimiert, ohne dass wir zusätzlichen Aufwand dafür tätigen müssen. Dies wird am deutlichsten, wenn wir uns vor Augen halten, wie wir Daten ohne LINQ und ohne Entity Framework beziehungsweise ohne ORMapper abfragen würden. Das geht beispielsweise über ADO.NET. Wenn man ADO.NET verwendet, arbeitet man häufig mit Commands. Diesen Commands wird ein entsprechender SQL-String übergeben, der häufig durch String-Verkettung entsteht. Also hier erweitere ich die Abfrage über die Variable name. Hier kann schon ein Fehler passieren. Denn mein Name als Klartext müsste eigentlich maskiert werden. Also wenn wir den String falsch schreiben, kommt es zu fehlerhaften SQL-Anweisungen. Das merken wir meist erst dann, wenn wir sie ausführen, nicht beim Schreiben. Hier haben wir in meinem Text schon den ersten Fehler, weil eben name nicht maskiert ist. Dafür kann man tatsächlich in ADO.NET auch Parameter verwenden, aber das ändert nichts daran, dass ich mich zum Beispiel beim SELECT verschreiben könnte. Wenn wir dann Abfragen machen, kann man diese nicht direkt auf die Ergebnismenge machen, sondern man muss zuerst die Daten auslesen. Das macht man über einen entsprechenden dataReader. Ganz zu Beginn war dieser dataReader noch nicht asynchron. Da musst man sich noch einiges einfallen lassen. Weiterhin hat man aber immer noch das Problem, dass man die Daten, die aus diesem dataReader kommen, konvertieren muss. Wenn ich sie also auf mein Personenobjekt übertragen möchte, muss ich auf die Spalte Name zugreifen und ich muss auf die Spalte BirthYear zugreifen. Ändert sich der Name dieser Spalte in der Datenbank, kommt es an dieser Stelle erst zur Laufzeit zu einem Fehler. Ein weiterer Fehler, den wir hier im Beispiel haben, ist, dass BirthYear wahrscheinlich kein String oder kein Objekt ist, sondern ein Integer. Es könnte also zu einer Konvertierungs-Exception kommen. Last but not least muss man dann die Daten in eine Liste übertragen, und danach kann man erst Listenoperation auf ihnen durchführen. Die Daten müssen also im Speicher vorliegen, damit die weiterverarbeitenden Instanzen diese auch weiter einschränken können. Auf die Weise geht sehr viel Leistung verloren. Sie sehen schon, mit LINQ sind Sie etwas besser bedient als mit ADO.NET, wobei Sie LINQ tatsächlich auch auf ADO.NET anwenden können. Häufig wird aber das Pattern verwendet, das wir schon gesehen haben, also das wir auf eine Property eines bestimmten Kontexts zugreifen, und diese Property ist dann eben die Liste. Wobei: Wir müssen das nicht unbedingt so machen, wie wir das hier sehen, sondern eigentlich bringt LINQ auch Extension Methods mit, die im Hintergrund durch die Expression Syntax einfach nur verwendet werden. Also die Expression Syntax spiegelt einen entsprechenden Ausdruck unter Nutzung von Schlüsselworten wider, während das zweite Verfahren auch als Fluent beziehungsweise Extension Syntax bezeichnet wird, da wir hier Extension Methods, Erweiterungsmethoden verwenden, die auf alle Formen von Listen anwendbar sind. Das heißt, diese beiden Aufrufe, die ich hier geschrieben habe, sind völlig äquivalent. Man spricht auch von einer Fluent Syntax, weil wir weitere Erweiterungsmethoden an die Listen anhängen können. Wir könnten bei Where zum Beispiel noch ein OrderBy anhängen, um die Liste dann zu sortieren. Wie ich bereits beim ADO.NET-Beispiel gesagt habe, erhalten wir durch LINQ gewisse Optimierungen. Während wir bei diesem ADO-Beispiel alle Daten in eine interne Liste laden mussten, können wir bei LINQ Anfragen auch erweitern. Denn tatsächlich findet sich in meinen foundPersons nicht etwa die eigentliche Ergebnismenge, sondern zuerst ist das nur die Abfrage, die ich definiert habe. Wenn ich nun mit elderlyPeople eine weitere Einschränkung vornehme, und zwar dass nur Personen zurückzugeben sind, die vor 1950 geboren wurden, dann wird die Ergebnismenge eingeschränkt, indem tatsächlich die Abfrage verändert wird, nicht aber die eigentliche Ergebnismenge schon abgefragt und danach erst eingeschränkt wird. Die Abfrage selbst passiert erst, wenn wir auf die Ergebnismenge zugreifen. in diesem Fall also elderlyPeople.ToList(). Mit ToList() mache ich daraus tatsächlich eine Liste meiner Ergebnisse. Und in diesem Moment wird die Anfrage an die Datenbank geschickt, und das Datenbankmanagementsystem kann sich um die entsprechende Auswertung kümmern. Auf die Weise sparen wir natürlich Speicher und wir sparen auch Rechenzeit. Intern funktioniert LINQ so, dass es zuerst aus Sprachbestandteilen besteht. Diese Sprachbestandteile; beziehungsweise intern nutzt LINQ die sogenannten LINQ-Provider, um die Daten für die Programmiersprachen und die weitere Verarbeitung aufzubereiten. Der LINQ-Provider ist also eine Schnittstelle zwischen der eigentlichen Datenquelle und unserer Programmierumgebung. Wir können LINQ dabei sowohl mit C# als auch VB.NET verwenden. F# ist aktuell nicht unterstützt. Daten, auf die wir zugreifen können, sind dabei jede Form von Objekthierarchien, die wir generell anlegen, also jedes List- oder Array-Objekt, das wir kennen. In diesem Fall spricht man einfach von LINQ to Objects, also jede Form von Objekten, die wir intern verwenden. Bei LINQ to DataSet handelt es sich um einen Provider, der Datenbanken anbindet über das ADO.NET. Wobei das nicht die einzige Möglichkeit ist, Datenbanken anzubinden, sondern man könnte auch noch das LINQ to SQL und LINQ to Entities verwenden. Hinter LINQ to SQL verbirgt sich ein älterer ORMapper, den Sie nach Möglichkeit nicht mehr verwenden sollten, da dieser von Microsoft nicht weiterentwickelt wird. Und hinter LINQ to Entities verbirgt sich ein LINQ-Provider, mit dem Sie Zugriffe auf Objektstrukturen aus dem Entity Framework vornehmen können. LINQ to XML ist ein LINQ-Provider, mit dem Sie XML-Dateien abrufen können. Dieser verfügt über eigene Datenobjekte und ist nicht ganz zu vergleichen mit anderen XML-Zugriffen, die Sie aus .NET eventuell kennen. Neben diesen weit verbreiteten LINQ-Providern gibt es noch weitere, wie zum Beispiel LINQ to SharePoint, oder die Reactive Extensions. Wichtig ist also nur, dass die Datenquelle in irgendeiner Weise strukturiert ist, und diese Struktur dann durch die LINQ-Provider aufbereitet werden kann. Es besteht also auch für Sie die Möglichkeit, einen eigenen LINQ-Provider zu schreiben, wenn Sie das möchten. Sie wissen nun, was LINQ ist, wie es funktioniert, welche Vorteile es hat, und wo es überall eingesetzt werden kann.

LINQ Grundkurs

Lernen Sie die LINQ-Operationen kennen und erstellen Sie praktische Abfragen direkt in C# und .NET.

2 Std. 10 min (26 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!