Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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:
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.
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: