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.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.