LINQ to Entities-Beispiele in der Methodensyntax

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

LINQ to Entities-Beispiele in der Methodensyntax

LINQ to Entities ist die Abfragesprache für den Zugriff auf Daten in den Entitäten eines Entity Data Models. Im vorliegenden Artikel sehen wir uns einige Beispiele für den Zugriff per LINQ auf die Daten unserer Beispielanwendung »Bestellverwaltung« an. Dabei verwenden wir in diesem Artikel die Methoden-Syntax von LINQ.

Voraussetzungen

Für die hier vorgestellten Beispiele verwenden wir das Entity Data Model der Anwendung Bestellverwaltung. Die Ergebnisse sollen jeweils in einem DataGrid ausgegeben werden. Dazu erstellen wir ein neues Fenster namens LINQBeispiele, dessen Entwurf wie in Bild 1 aussieht. Die Definition ist einfach gehalten. Die wichtigsten Elemente ist das Kombinationsfeld cboBeispiele, mit dem Sie die Beispiele auswählen können, die wir anschließend per C#-Code zum Code behind-Modul hinzufügen, sowie das DataGrid-Steuerelement db, welches das Ergebnis der jeweiligen Abfrage anzeigen soll. Das ComboBox-Steuerelement ist an die Eigenschaft Beispiele gebunden und löst das Ereignis SelectionChanged aus:

Fenster zur Ausgabe der Beipiele

Bild 1: Fenster zur Ausgabe der Beipiele

<Window x:Class="Bestellverwaltung.LINQBeispiele"
         Title="LINQBeispiele" Height="300" Width="400">
     <Grid>
         ... Grid-Definition ...
         <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
             <Label Margin="5">LINQ-Beispiel:</Label>
             <ComboBox x:Name="cboBeispiele" Margin="5" Width="200" SelectionChanged="cboBeispiele_SelectionChanged" 
                 ItemsSource="{Binding Beispiele}"></ComboBox>
         </StackPanel>
         <DataGrid x:Name="dg" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="5"></DataGrid>
         <Button x:Name="btnOK" Grid.Row="2" Margin="5" Width="50" Click="btnOK_Click">OK</Button>
     </Grid>
</Window>

In der Code behind-Klasse erstellen wir ein Datenbank-Kontext-Objekt mit Zugriff auf das Entity Data Model sowie eine ObservableCollection, welche die Liste der Beispiele für das Kombinationsfeld enthält:

BestellverwaltungEntities dbContext = new BestellverwaltungEntities();
private ObservableCollection<string> beispiele;
public ObservableCollection<string> Beispiele {
     get { return beispiele; }
     set { beispiele = value; }
}

In der Konstruktor-Methode erstellen wir die ObservableCollection und füllen diesem mit Einträgen wie hier am Beispiel Alle Kunden:

public LINQBeispiele() {
     InitializeComponent();
     beispiele = new ObservableCollection<string>();
     beispiele.Add("Alle Kunden");
     DataContext = this;
}

Für das konkrete Beispiel, alle Kunden anzuzeigen, definieren wir auch wieder eine ObservableCollection:

private ObservableCollection<Kunde> kunden;
public ObservableCollection<Kunde> Kunden {
     get { return kunden; }
     set { kunden = value; }
}

Diese wird schließlich gefüllt und angezeigt, wenn der Benutzer den Eintrag Alle Kunden aus dem Kombinationsfeld auswählt. Dies löst das Ereignis SelectionChanged aus, für das wir die folgende Ereignismethode hinterlegt haben:

private void cboBeispiele_SelectionChanged(object sender, SelectionChangedEventArgs e) {
     ComboBox cbo = (ComboBox)sender;
     string beispiel = (string)cbo.SelectedItem;
     switch (beispiel) {
         case "Alle Kunden":
             kunden = new ObservableCollection<Kunde>(dbContext.Kunden);
             dg.ItemsSource = Kunden;
             break;
         default:
             break;
     }
}

Für den Eintrag Alle Kunden füllt die Methode nun die ObservableCollection namens kunden mit den über den LINQ-Ausdruck dbContext.Kunden ermittelten Kunden. Die Eigenschaft Kunden wird dann noch dem DataGrid dg zugewiesen, damit dieses die Kundenliste wie in Bild 2 anzeigt. Das DataGrid ist ja flexibel, das heißt, Sie können ihm beliebige Auflistungen zuweisen. Wir fügen daher, wenn wir in den folgenden Beispielen andere ObservableCollections als Kunden nutzen, einfach entsprechende neue ObservableCollections hinzu und weisen die entsprechende Collection der Eigenschaft ItemsSource des DataGrid-Elements zu.

Ausgabe aller Kunden des Entity Data Models

Bild 2: Ausgabe aller Kunden des Entity Data Models

Alle Elemente einer Klasse

Das erste Beispiel haben Sie ja schon kennengelernt. Um alle Elemente einer Klasse beziehungsweise Auflistung zu liefern, brauchen Sie diese einfach nur gemeinsam mit dem dbContext-Objekt als Inhalt der neuen ObservableCollection anzugeben:

kunden = new ObservableCollection<Kunde>(dbContext.Kunden);

Dies liefert alle Elemente der Kunden-Auflistung des Entity Data Models. Alle Elemente von anderen Klassen können Sie ebenso leicht holen, dazu müssen Sie nur die entsprechende ObservableCollection definieren und dem DataGrid zuweisen. Wenn Sie nun also alle Produkte ausgeben wollen, legen Sie erst eine neue ObservableCollection samt privater und öffentlicher Variable an:

private ObservableCollection<Produkt> produkte;
public ObservableCollection<Produkt> Produkte {
     get { return produkte; }
     set { produkte = value; }
}

Dann fügen Sie einen neuen Eintrag zur ComboBox hinzu:

public LINQBeispiele() {
     ...
     beispiele.Add("Alle Produkte");
     ...
}

Schließlich noch der neue case-Zweig in der switch-Bedingung:

case "Alle Produkte":
     produkte = new ObservableCollection<Produkt>(dbContext.Produkte);
     dg.ItemsSource = Produkte;
     break;

Damit können wir uns nun in den folgenden Beispielen auf die LINQ-Ausdrücke konzentrieren.

Sortieren von Elementen

Zum Sortieren nutzen wir die OrderBy- oder die OrderByDescending-Methode. Letztere ist für die absteigende Sortierung verantwortlich. Der folgende Ausdruck liefert alle Kunden, aufsteigend sortiert nach den Nachnamen:

dbContext.Kunden.OrderBy(d => d.Nachname)

Wenn Sie die Kunden absteigend nach den Nachnamen sortieren wollen, verwenden Sie OrderByAscending:

dbContext.Kunden.OrderByDescending(d => d.Nachname)

Für Sortierungen nach verschiedenen Feldern in der gleichen Abfrage verwenden Sie OrderBy/OrderByDescending- gefolgt von einem oder mehreren Aufrufen der ThenBy/ThenByDescending-Methode. Wenn Sie also zuerst nach dem Nachnamen und dann nach dem Vornamen sortieren wollen, verwenden Sie den folgenden Ausdruck:

dbContext.Kunden.OrderBy(d => d.Nachname).ThenBy(d => d.Vorname)

Man könnte fälschlicherweise meinen, zwei aufeinanderfolgende Aufrufe der OrderBy-Methode würden die Aufgabe auch erledigen. Das ist aber mitnichten der Fall. Die folgende Abfrage sortiert nämlich erst nach dem Vornamen und dann nach dem Nachnamen – allerdings wird die erste Sortierung beim Ausführen der zweiten verworfen, sodass auch bei mehreren gleichen Nachnamen die Datensätze nur zufällig richtig nach dem Vornamen sortiert sein dürften:

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]