LINQ Grundkurs

Joins

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Equijoins und Outer Joins sind mit LINQ kein Problem, nur die Schreibweise ist im ersten Moment nicht ganz offensichtlich.
06:13

Transkript

Ein gleichsam wichtiges wie komplexes Mittel, das wir für unsere Arbeit brauchen, sind die sogenannten Joins. Ich möchte dies zeigen, indem ich für jede Person meiner Liste die Straße angebe, in der sie wohnt. Um dies tun zu können, muss ich die Adressliste mit der Personenliste joinen. Dafür verwende ich in der Expression Syntax zuerst den Befehl "join", um anzugeben, welche zweite Liste nun gejoint werden soll. Der erste Schritt dabei ist, eine Variable für die Elemente zu vergeben, ähnlich wie wir das von "from" kennen. Ich gebe also als Name "adresse" an. Und dann muss ich die Datenquelle angeben. Die Datenquelle ist bei mir eine zweite Liste, die auch im Repository hinterlegt ist. Nun joine ich meine Adresse auf meine Person. Damit das auch richtig funktioniert, muss ich noch eine Art Mapping angeben. Also, welche Elemente sollen miteinander verglichen werden? Das mache ich über den "on"-Befehl, und gebe hier an, dass von "person" , "die Property Adresse", welche die Adress-ID enthält, mit der übereinstimmen muss, die auch in "adresse" hinterlegt ist. Also nochmal: Wir lassen uns Personen aus einer Personenliste geben, wir lassen uns Adressen aus einer Adressliste geben. Und dann machen wir ein Equijoin. Das heißt, das für jede Adress-ID, die ich zurückbekomme, genau eine Adresse zurückkommt, die aus der Adressliste stammt. Nun kann ich an dieser Stelle auf jene Adresse zugreifen, und kann mir dort die "Straße" holen. In der Fluent Syntax sieht das nicht unbedingt anders aus. Dort nutze ich die Extension Method "Join". An erster Stelle gebe ich dann an, welche Liste gejoint werden soll. Also, tatsächlich ist meine Outer List "Personen" und meine Inner List sind jetzt die "Adressen", wie wir das oben auch schon stehen haben. Und danach gebe ich wieder die entsprechenden Mappings an. Also: welche beiden Elemente sollen miteinander verglichen werden? Ich schreibe also einen Lambda-Ausdruck und lasse mir von "person" die "Id"zurückgeben. Danach den "innerKeySelector". Das ist also der Schlüssel aus meiner Adressliste. Das ist die "Id". Jetzt habe ich einen Fehler gemacht: Die "person" hat keine "Id", sondern bei ihr ist es die "Adresse", die auf "Id" gemappt werden soll. Abschließend muss ich noch einen Lambda-Ausdruck angeben, um zu sagen, wie das Ganze projiziert werden soll. Da lasse ich mir wieder eine Person und eine Adresse geben. Der Einfachheit halber schreibe ich dies jetzt mal mit "p" und "a". Da lasse ich mir einen anonymen Typ erzeugen, der von der Person den Namen enthält und von der Adresse die Straße. Ich habe auf diese Weise hier in der Fluent Syntax die gleiche Situation wie in der Expression Syntax. Ein Grund, warum ich dieses "p" und "a" geschrieben habe statt "person" und "adresse", ist, damit Sie auch sehen, dass dies hier drei unterschiedliche Lambda-Ausdrücke sind. Hier oben sind das Projizierungen, um anzugeben, welche Schlüssel miteinander verglichen werden sollen, während hier unten eine Projektion stattfindet, um die Rückgabedaten zu bestimmen. Denn das, was wir hier letztendlich bekommen, ist eben eine Liste von Namen und Straßen. Das Ganze funktioniert jetzt soweit, dass wir eben einen Equijoin haben. Demzufolge wird für jede Adress-ID auch immer ein Datensatz zurückgegeben. Es kann aber auch sein, dass es mehrere Adressen für eine Person gibt. Dann müssen wir einen Outer Join machen. In der Expression Syntax machen wir das durch eine Anpassung. Und zwar sagen wir, worein die Ergebnisse dieses Joins gemerged werden sollen. Das sind bei mir jetzt die "adressen". Anschließend kann ich bei der Projektion auf diese Adressen zugreifen. Und gebe jetzt für jeden Personennamen eine Liste von Adressen zurück. Sehen wir auch in der Rückgabeliste. Denn in der Rückgabeliste bekommen wir eine Liste von anonymen Typen, die aus Namen und Listen von Adressen bestehen. Für die Fluent-Schreibweise müssen wir auch eine Anpassung machen. Denn statt des Joins verwenden wir einen "GroupJoin". Das kann man sich am besten so vorstellen, dass wir hier eine Gruppierung der Adressen nach dem Personennamen vorgenommen haben. Daher auch der Name "GroupJoin". Alles andere bleibt nahezu gleich, nur dass dieses "a" jetzt eben eine Liste von Adressen ist und nicht mehr eine Einzeladresse. Auf diese Weise bekomme ich jetzt die gleichen Ergebnisse wie hier oben. Ich bekomme einen Personennamen und dazu eine Liste von Adressen. Sie haben also gesehen, wie Sie mit LINQ auf unterschiedliche Weise sowohl Inner Equijoins als auch Outer Joins erstellen können. Ganz wichtig ist dabei, in welcher Reihenfolge Sie die Definitionen vornehmen, welche Liste Ihre Inner List und welche Ihre Outer List ist. Dies ist essenziell dafür, ob der Join gelingt oder nicht. Kommt es also zu Fehlern, überprüfen Sie bitte nochmal, ob Sie die richtigen Listen an den richtigen Stellen verwenden.

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!