Übersicht über das LinqDataSource-Webserversteuerelement
Aktualisiert: November 2007
Das LinqDataSource-Steuerelement macht durch die ASP.NET-Datenquellen-Steuerelementarchitektur LINQ (Language-Integrated Query, sprachenintegrierte Abfragen) für Webentwickler verfügbar. LINQ stellt ein einheitliches Programmiermodell zum Abfragen und Aktualisieren von Daten aus verschiedenen Datenquellentypen bereit und erweitert direkt die Datenfunktionen der Sprachen C# und Visual Basic. Durch Anwenden der Prinzipien der objektorientierten Programmierung auf relationale Daten wird durch LINQ die Interaktion zwischen objektorientierter Programmierung und relationalen Daten vereinfacht. Weitere Informationen zu LINQ finden Sie unter Sprachintegrierte Abfrage (Language-Integrated Query, LINQ).
Mit deklarativem Markup können Sie ein LinqDataSource-Steuerelement erstellen, das eine Verbindung mit Daten in einer Datenbank oder einer speicherinternen Datenauflistung wie einem Array herstellt. In dem deklarativen Text können Sie alle Bedingungen angeben, die zum Abrufen, Filtern, Sortieren oder Gruppieren der Daten erfüllt sein müssen. Beim Abrufen von Daten aus einer SQL-Datenbanktabelle können Sie auch ein LinqDataSource-Steuerelement zum Aktualisieren, Einfügen und Löschen von Daten konfigurieren. Das Steuerelement ermöglicht dies, ohne dass Sie die SQL-Befehle zum Durchführen dieser Aufgaben selbst schreiben müssen. Außerdem stellt die LinqDataSource-Klasse ein Ereignismodell bereit, das Ihnen ermöglicht, benutzerdefinierte Szenarien zu behandeln.
Dieses Thema enthält folgende Abschnitte:
Szenarien
Hintergrund
Codebeispiele
Klassenverweis
Szenarien
Sie verwenden das LinqDataSource-Steuerelement beim Erstellen einer Webseite, die Daten abruft oder ändert, und Sie die Vorteile des einheitlichen Programmiermodells nutzen möchten, das von LINQ bereitgestellt wird. Sie können den Code in einer Webseite vereinfachen, indem Sie das LinqDataSource-Steuerelement aktivieren, sodass die Befehle zum Interagieren mit den Daten automatisch erstellt werden.
Zurück nach oben
Hintergrund
Das LinqDataSource-Steuerelement bietet Ihnen die Möglichkeit, ein Datensteuerelement mit einer Vielzahl von Datenquellen zu verbinden. Hierzu gehören Datenbankdaten, Datenquellenklassen und speicherinterne Auflistungen. Mit dem LinqDataSource-Steuerelement können Sie für all diese Datenquellentypen datenbankähnliche Aufgaben für den Datenabruf (Auswählen, Filtern, Gruppieren und Sortieren) angeben. Sie können Änderungsaufgaben (Aktualisieren, Löschen und Einfügen) für Datenbanktabellen angeben.
Sie können das LinqDataSource-Steuerelement mit einer beliebigen Datenauflistung verbinden, die in einem öffentlichen Feld oder einer öffentlichen Eigenschaft gespeichert ist. Das deklarative Markup und der Code zum Durchführen von Datenoperationen sind für alle Datenquellen identisch. Sie müssen beim Interagieren mit Daten einer Datenbanktabelle oder einer Datenauflistung wie einem Array keine unterschiedliche Syntax verwenden.
Eine Einführung für das LinqDataSource-Steuerelement finden Sie unter Exemplarische Vorgehensweise: Abrufen, Aktualisieren, Einfügen und Löschen von Daten mit dem LinqDataSource-Steuerelement und dem DetailsView-Steuerelement.
Herstellen einer Verbindung mit Daten einer Datenbank
Beim Interagieren mit Daten einer Datenbank verbinden Sie das LinqDataSource-Steuerelement nicht direkt mit der Datenbank. Stattdessen interagieren Sie mit Entitätsklassen, die die Datenbank und die Tabellen darstellen. Sie können die Entitätsklassen mit dem O/R-Designer oder durch Ausführen des Dienstprogramms SqlMetal.exe generieren. Weitere Informationen finden Sie unter Object Relational Designer (O/R-Designer) oder unter Tool zur Codegenerierung (SqlMetal.exe). Die von Ihnen erstellten Entitätsklassen befinden sich normalerweise im Ordner App_Code der Webanwendung. Der O/R-Designer bzw. das Dienstprogramm SqlMetal.exe generiert eine Klasse, die die Datenbank darstellt, sowie eine Klasse für jede Tabelle in der Datenbank.
Die Klasse, die die Datenbank darstellt, ist für das Abrufen und Festlegen von Werten in der Datenquelle verantwortlich. Das LinqDataSource-Steuerelement liest und setzt die Eigenschaften in der Klasse, die die Datentabelle darstellt. Um Aktualisierungs-, Einfüge- und Löschoperationen zu unterstützen, muss die Datenbankklasse von der DataContext-Klasse abgeleitet werden und die Tabellenklasse muss auf eine Table<TEntity>-Klasse verweisen.
Sie verbinden das LinqDataSource-Steuerelement mit einer Datenbankklasse, indem Sie die ContextTypeName-Eigenschaft auf den Namen der Klasse setzen, die die Datenbank darstellt. Sie verbinden das LinqDataSource-Steuerelement mit einer bestimmten Tabelle, indem Sie die TableName-Eigenschaft auf den Namen der Klasse setzen, die die Datentabelle darstellt. Um beispielsweise eine Verbindung zur Tabelle Contacts in der Datenbank AdventureWorks herzustellen, setzten Sie die ContextTypeName-Eigenschaft auf AdventureWorksDataContext (bzw. den von Ihnen für das Datenbankobjekt angegebenen Namen). Setzen Sie die TableName-Eigenschaft auf Contacts. Das folgende Beispiel zeigt das Markup für ein LinqDataSource-Steuerelement, das eine Verbindung zur Datenbank AdventureWorks herstellt.
<asp:LinqDataSource
ContextTypeName="AdventureWorksDataContext"
TableName="Contacts"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
Das Beispiel enthält nicht die vom O/R-Designer generierte Klasse, da der generierte Code für dieses Thema zu umfangreich ist. Der generierte Code muss jedoch vorhanden sein, damit das Beispiel funktioniert. Weitere Informationen finden Sie unter Codegenerierung in LINQ to SQL.
Herstellen einer Verbindung mit Daten einer speicherinternen Auflistung
Beim Herstellen einer Verbindung mit einer speicherinternen Datenauflistung wie einem Array setzen Sie die ContextTypeName-Eigenschaft auf den Namen der Klasse, die die Auflistung enthält. Setzen Sie die TableName-Eigenschaft auf den Namen der Auflistung selbst.
Das folgende Beispiel zeigt eine Klasse, die ein Array mit Zeichenfolgenwerten enthält.
Public Class MovieLibrary
Dim _availableGenres() As String = {"Comedy", "Drama", "Romance"}
Public ReadOnly Property AvailableGenres() As String()
Get
Return _availableGenres
End Get
End Property
End Class
public class MovieLibrary
{
string[] _availableGenres = { "Comedy", "Drama", "Romance" };
public MovieLibrary()
{
}
public string[] AvailableGenres
{
get
{
return _availableGenres;
}
}
}
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das die Liste der Filmgenres aus der Klasse im vorherigen Beispiel liest. Um das Array der Genres abzurufen, setzen Sie die ContextTypeName-Eigenschaft auf MovieLibrary und die TableName-Eigenschaft auf AvailableGenres.
<asp:LinqDataSource
ContextTypeName="MovieLibrary"
TableName="AvailableGenres"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
Verwenden des LinqDataSource-Steuerelements mit datengebundenen Steuerelementen
Um die Daten eines LinqDataSource-Steuerelements anzuzeigen, können Sie ein datengebundenes Steuerelement an das LinqDataSource-Steuerelement binden. Beispielsweise binden Sie ein DetailsView-Steuerelement, ein GridView-Steuerelement oder ein ListView-Steuerelement an ein LinqDataSource-Steuerelement. Setzen Sie hierzu die DataSourceID-Eigenschaft des datengebundenen Steuerelements auf die ID des LinqDataSource-Steuerelements. Das folgende Beispiel zeigt ein GridView-Steuerelement, das alle Daten eines LinqDataSource-Steuerelements anzeigt.
<asp:LinqDataSource
ContextTypeName="AdventureWorksDataContext"
TableName="Contacts"
ID="LinqDataSource1">
</asp:LinqDataSource>
<asp:GridView
ID="GridView1"
DataSourceID="LinqDataSource1" >
</asp:GridView>
Das datengebundene Steuerelement erstellt die Benutzeroberfläche zum Anzeigen der Daten des LinqDataSource-Steuerelements automatisch. Außerdem kann es die Schnittstelle zum Sortieren und für das Paging der Daten bereitstellen. Wenn das Ändern der Daten gestattet ist, wird vom datengebundenen Steuerelement die Schnittstelle zum Aktualisieren, Einfügen und Löschen von Datensätzen bereitgestellt.
Sie können einschränken, welche Daten (Eigenschaften) angezeigt werden, indem Sie das datengebundene Steuerelement so konfigurieren, dass Datensteuerelementfelder nicht automatisch generiert werden. Anschließend können Sie die entsprechenden Felder im datengebundenen Steuerelement explizit definieren. Das LinqDataSource-Steuerelement ruft alle Eigenschaften ab, jedoch werden vom datengebundenen Steuerelement nur die von Ihnen angegebenen Eigenschaften angezeigt. Das folgende Beispiel zeigt ein GridView-Steuerelement, das nur die Name-Eigenschaft und die StandardCost-Eigenschaft aus der Tabelle Products in der Datenbank AdventureWorks anzeigt. Die AutoGenerateColumns-Eigenschaft ist auf false festgelegt.
<asp:LinqDataSource
ContextTypeName="AdventureWorksDataContext"
TableName="Products"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
<asp:GridView
DataSourceID="LinqDataSource1"
AutoGenerateColumns="false"
ID="GridView1"
>
<Columns>
<asp:BoundField DataField="Name" />
<asp:BoundField DataField="StandardCost" />
</Columns>
</asp:GridView>
Wenn Sie einschränken müssen, welche Eigenschaften in der Abfrage zurückgegeben werden, definieren Sie die entsprechenden Eigenschaften, indem Sie die Select-Eigenschaft des LinqDataSource-Steuerelements festlegen.
Vergleichen des LinqDataSource-Steuerelements mit anderen Datenquellensteuerelementen
Beim Verwenden des LinqDataSource-Steuerelements müssen Sie im Vergleich zum Arbeiten mit dem SqlDataSource-Steuerelement oder dem ObjectDataSource-Steuerelement weniger Code zum Durchführen von Datenoperationen schreiben. Das LinqDataSource-Steuerelement kann Informationen über die Datenquelle, mit der Sie eine Verbindung herstellen, ableiten und die Befehle zum Auswählen, Aktualisieren, Einfügen und Löschen von Daten dynamisch erstellen. Wenn Sie das LinqDataSource-Steuerelement verwenden, müssen Sie sich außerdem nur mit einem Programmiermodell auskennen, um mit verschiedenen Datenquellentypen zu interagieren.
Vergleichen des SqlDataSource-Steuerelements
Im Gegensatz zum SqlDataSource-Steuerelement, das nur mit relationalen Datenbanktabellen arbeitet, ermöglicht Ihnen das LinqDataSource-Steuerelement, eine Verbindung mit Daten herzustellen, die in speicherinternen Auflistungen gespeichert sind. Beim Verwenden des SqlDataSource-Steuerelements müssen Sie die Eigenschaften SelectCommand, UpdateCommand, InsertCommand und DeleteCommand explizit auf SQL-Abfragen festlegen. Mit dem LinqDataSource-Steuerelement müssen Sie diese Befehle jedoch nicht explizit festlegen, da sie das LinqDataSource-Steuerelement mithilfe von LINQ to SQL automatisch erstellt. Wenn Sie ändern möchten, welche Spalten einer Datenquelle ausgewählt werden, müssen Sie keinen vollständigen SQL-Select-Befehl schreiben. Stattdessen geben Sie die Namen der Spalten, die Sie in der Abfrage zurückgeben möchten, in der Select-Eigenschaft an.
Beim Aktualisieren oder Einfügen von Daten müssen Sie für die Werte, die in der Datenbank gespeichert werden, keine Parameter erstellen. Das LinqDataSource-Steuerelement kann Aktualisierungsbefehle mit den geeigneten Werten durch Zuordnen der DataField-Eigenschaft zu den Eigenschaftennamen in der Entitätsklasse erstellen.
Vergleichen des ObjectDataSource-Steuerelements
Beim Verwenden des ObjectDataSource-Steuerelements müssen Sie das Objekt, das die Daten darstellt, manuell erstellen und anschließend die Methoden zum Interagieren mit den Daten schreiben. Anschließend müssen Sie die Eigenschaften SelectMethod, UpdateMethod, InsertMethod und DeleteMethod den Methoden zuordnen, die diese Funktionen durchführen. Beim LinqDataSource-Steuerelement verwenden Sie den O/R-Designer, um die Klassen, die die Daten darstellen, automatisch zu erstellen. Sie müssen keinen Code zum Angeben schreiben, welche Spalten in der Datenbanktabelle vorhanden sind oder wie Daten ausgewählt, aktualisiert, eingefügt und gelöscht werden. Außerdem können Sie mit dem LinqDataSource-Steuerelement direkt mit einer Datenauflistung wie einem Array interagieren. In diesem Fall müssen Sie keine Klasse für die Logik zum Interagieren mit der Datenauflistung erstellen.
Auswählen von Daten
Wenn Sie für die Select-Eigenschaft des LinqDataSource-Steuerelements keinen Wert angeben, werden alle Eigenschaften in der Datenquellenklasse abgerufen. Beispielsweise gibt das LinqDataSource-Steuerelement für jede Spalte einer Datenbanktabelle einen Wert zurück.
Sie können einschränken, welche Eigenschaften aus der Datenquelle abgerufen werden, indem Sie die Select-Eigenschaft auf die gewünschten Eigenschaften setzen. Wenn Sie nur eine Eigenschaft zurückgeben möchten, setzen Sie die Select-Eigenschaft auf diese Eigenschaft. Um beispielsweise nur die Werte der Spalte City einer Datenbanktabelle zurückzugeben, setzen Sie die Select-Eigenschaft auf City. Das LinqDataSource-Steuerelement gibt eine List<T>-Auflistung zurück, die die ordnungsgemäß typisierten Elemente der Eigenschaft enthält. Wenn die City-Eigenschaft als Text (Zeichenfolge) typisiert ist, wird beim Auswählen der City-Eigenschaft eine List<T>-Auflistung mit Zeichenfolgenwerten zurückgegeben.
Um nur einige der Eigenschaften der Datenklasse zurückzugeben, verwenden Sie die new-Funktion in der Select-Eigenschaft und geben an, welche Spalten zurückgegeben werden sollen. Die new-Funktion ist erforderlich, da Sie dynamisch eine Klasse erstellen, die nur die von Ihnen angegebenen Eigenschaften enthält. Wenn Sie beispielsweise die City-Eigenschaft und die PostalCode-Eigenschaft aus einer Datenquelle abrufen möchten, die vollständige Adressen enthält, setzen Sie die Select-Eigenschaft auf new(City, PostalCode). Das LinqDataSource-Steuerelement gibt eine List<T>-Auflistung mit Instanzen einer Klasse zurück, die diese Eigenschaften enthält.
Wenn Sie nur eine Eigenschaft auswählen, müssen Sie die new-Funktion nicht verwenden, da das zurückgegebene Objekt eine einfache Auflistung der Werte dieser Eigenschaft ist. Bei mehreren Eigenschaften muss das LinqDataSource-Steuerelement jedoch eine neue Klasse erstellen, die die von Ihnen angegebenen Eigenschaften enthält.
Berechnen von Werten mit der Select-Klausel
Sie können Werte in einer Select-Klausel berechnen. Um beispielsweise für eine Bestellung den Gesamtbetrag eines Zeilenelements zu berechnen, setzen Sie die Select-Eigenschaft auf new(SalesOrderDetailID, OrderQty * UnitPrice As LineItemTotal). Das As-Schlüsselwort ermöglicht Ihnen, dem berechneten Wert einen Namen (Alias) zuzuweisen. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Auswählen und Filtern einer Teilmenge von Daten mit dem LinqDataSource-Steuerelement und dem GridView-Steuerelement.
Das folgende Beispiel zeigt, wie Sie mit einem LinqDataSource-Steuerelement eine Teilmenge von Daten abrufen. Im Beispiel wird die Select-Eigenschaft gesetzt, um den zurückgegebenen Werten einen Alias zuzuweisen und einen Wert zu berechnen.
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="OrderDetails"
Select="new(SalesOrderDetailID As DetailID,
OrderQty * UnitPrice As LineItemTotal,
DateCreated As SaleDate)"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
Filtern von Daten mit der Where-Klausel
Sie können die zurückgegebenen Daten filtern, um nur die Datensätze abzurufen, die besondere Kriterien erfüllen. Legen Sie hierfür die Where-Eigenschaft auf die Bedingungen fest, die ein Datensatz erfüllen muss, damit er zu den zurückgegebenen Daten gehört. Wenn Sie für die Where-Eigenschaft keinen Wert angeben, werden alle Datensätze der Datenquelle abgerufen. Sie können die Daten filtern, indem Sie einen Filterausdruck erstellen, der durch einen Vergleich ermittelt, ob ein Datensatz eingeschlossen werden soll. Der Vergleich kann anhand eines statischen oder eines variablen Werts erfolgen, den Sie mit einem Parameterplatzhalter angeben.
Erstellen einer Where-Klausel mit statischen Werten
Beim Vergleichen des Werts einer Eigenschaft mit einem statischen Wert definieren Sie die Where-Eigenschaft mit der Eigenschaft und dem statischen Wert. Um beispielsweise nur die Datensätze zurückzugeben, deren ListPrice-Wert größer als 1000 ist, setzen Sie die Where-Eigenschaft auf ListPrice > 1000.
Für das logische UND können Sie den &&-Operator oder den and-Operator verwenden, für das logische ODER den ||-Operator oder den or-Operator. Legen Sie z. B. die Where-Eigenschaft auf ListPrice > 1000 || UnitCost > 500 || DaysToManufacture > 3 fest, um Datensätze zurückzugeben, deren ListPrice-Wert größer als 1000, deren UnitCost-Wert größer als 500 oder deren DaysToManufacture-Wert größer als 3 ist. Um festzulegen, dass alle drei Bedingungen erfüllt sein müssen, damit ein Datensatz zurückgegeben wird, legen Sie die Where-Eigenschaft auf ListPrice > 1000 && UnitCost > 500 && DaysToManufacture > 3 fest.
Beim Vergleichen von Zeichenfolgen müssen Sie die Bedingungen in einfache Anführungszeichen und den Literalwert in doppelte Anführungszeichen einschließen. Setzen Sie die Where-Eigenschaft beispielsweise auf 'Category = "Sports"', um nur die Datensätze abzurufen, die in der Category-Spalte die Zeichenfolge "Sports" enthalten.
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement zum Abrufen von Daten, die sowohl anhand eines Zeichenfolgenwerts als auch eines numerischen Werts gefiltert werden.
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Product"
Where='Category = "Sports" && Weight < 10'
ID="LinqDataSource1"
</asp:LinqDataSource>
Erstellen einer parametrisierten Where-Klausel
Wenn Sie den Wert einer Eigenschaft mit einem Wert vergleichen möchten, der nur zur Laufzeit bekannt ist, definieren Sie in der WhereParameters-Eigenschaftenauflistung einen Parameter. Wenn Sie beispielsweise anhand eines Werts filtern möchten, der vom Benutzer bereitgestellt wird, erstellen Sie einen Parameter, der den Wert darstellt. Das LinqDataSource-Steuerelement erstellt die Where-Klausel mit dem aktuellen Wert des Parameters.
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das Daten abhängig von der Auswahl des Benutzers im Steuerelement DropDownList1 abruft.
<asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
<asp:ListItem Value="Sports">Sports</asp:ListItem>
<asp:ListItem Value="Garden">Garden</asp:ListItem>
<asp:ListItem Value="Auto">Auto</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
AutoGenerateWhereClause="true"
ID="LinqDataSource1"
>
<WhereParameters>
<asp:ControlParameter
Name="Category"
ControlID="DropDownList1"
Type="String" />
</WhereParameters>
</asp:LinqDataSource>
<asp:GridView
DataSourceID="LinqDataSource1"
ID="GridView1"
>
</asp:GridView>
Das LinqDataSource-Steuerelement erstellt die Where-Klausel automatisch, wenn Sie die AutoGenerateWhereClause-Eigenschaft auf true festlegen. Diese Option ist hilfreich, wenn Sie über mehrere Parameter verfügen, da Sie nicht alle Bedingungen in der Where-Eigenschaft angeben müssen. Fügen Sie die Parameter stattdessen der WhereParameters-Eigenschaftenauflistung hinzu, und die Where-Klausel mit den entsprechenden Parametern wird vom LinqDataSource-Steuerelement erstellt.
Wenn Sie die AutoGenerateWhereClause auf true setzen, müssen die Namen der Parameter mit den Namen der entsprechenden Eigenschaften übereinstimmen. Um beispielsweise den Wert eines Parameters anhand der Category-Eigenschaft zu überprüfen, muss der Parametername Category lauten. Alle Vergleiche können nur auf Gleichheit erfolgen. Sie können nicht testen, ob ein Wert größer oder kleiner als der Parameterwert ist. Wenn Sie in der WhereParameters-Auflistung mehrere Parameter angeben, werden sie mit einem logischen UND verknüpft.
Wenn Sie auf Ungleichheit prüfen oder Bedingungen mit einem logischen ODER verknüpfen müssen, setzen Sie die AutoGenerateWhereClause-Eigenschaft auf false. Anschließend können Sie die Bedingungen in der Where-Eigenschaft definieren. Geben Sie in der Where-Eigenschaft für jeden Parameter einen Platzhalter an.
Das folgende Beispiel zeigt, wie Sie beim Filtern der Daten auf Ungleichheit prüfen.
<asp:DropDownList
AutoPostBack="true"
ID="DropDownList1"
>
<asp:ListItem Value="0">0</asp:ListItem>
<asp:ListItem Value="25">25</asp:ListItem>
<asp:ListItem Value="100">100</asp:ListItem>
<asp:ListItem Value="400">400</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
Where="Price > @UserPrice"
ID="LinqDataSource1"
>
<WhereParameters>
<asp:ControlParameter
Name="UserPrice"
DefaultValue="0"
ControlID="DropDownList1"
Type="Int32" />
</WhereParameters>
</asp:LinqDataSource>
<asp:GridView
DataSourceID="LinqDataSource1"
ID="GridView1"
>
</asp:GridView>
Weitere Informationen finden Sie unter AutoGenerateWhereClause.
Gruppieren und Aggregieren von Daten
Sie können Daten gruppieren, um die Daten für Datensätze zu konsolidieren, die in einer oder mehreren Spalten allgemeine Werte haben. Setzen Sie hierfür die GroupBy-Eigenschaft auf die Namen der Eigenschaften, die Sie zum Konsolidieren der Daten verwenden möchten. Um beispielsweise die Datensätze einer Tabelle mit Adressinformationen anhand des Werts für die Stadt zu gruppieren, setzen Sie GroupBy auf City.
Sie können mithilfe der gruppierten Daten Werte berechnen (z. B. den Durchschnitt oder die Summe einer Eigenschaft), indem Sie Aggregatfunktionen zusammen mit der GroupBy-Eigenschaft verwenden. Sie rufen die Werte ab, die zum Gruppieren verwendet werden, indem Sie auf das Key-Objekt verweisen.
Das folgende Beispiel zeigt, wie Sie die Daten anhand der Eigenschaft ProductCategory gruppieren. Die gruppierten Werte werden abgerufen, indem Key in der Select-Eigenschaft angegeben wird. Außerdem werden die Average-Aggregatmethode und die Count-Aggregatmethode in der Select-Eigenschaft angegeben.
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
GroupBy="ProductCategory"
Select="new(Key,
Average(ListPrice) As AverageListPrice,
Average(Cost) As AverageCost,
Count() As RecordCount)"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
Sie können die einzelnen Datensätze, die zu einer Gruppe gehören, mit dem It-Schlüsselwort abrufen. Weitere Informationen finden Sie unter Gewusst wie: Gruppieren und Aggregieren von Daten mithilfe des LinqDataSource-Steuerelements.
Aggregatmethoden
In der folgenden Tabelle sind die Aggregatmethoden aufgelistet, die verfügbar sind, wenn Sie das LinqDataSource-Steuerelement verwenden.
Aggregatfunktion |
Beschreibung |
---|---|
Count() |
Gibt die Gesamtanzahl an Datensätzen für einen Satz von Daten zurück. |
Average(Spalte) |
Gibt für alle zurückgegebenen Datensätze den Mittelwert der angegebenen Spalte zurück. |
Sum(Spalte) |
Gibt für alle zurückgegebenen Datensätze den Wert der Addition aller Werte der angegebenen Spalte zurück. |
Max(Spalte) |
Gibt für alle zurückgegebenen Datensätze den maximalen Wert der angegebenen Spalte zurück. |
Min(Spalte) |
Gibt für alle zurückgegebenen Datensätze den minimalen Wert der angegebenen Spalte zurück. |
Where(Bedingung) |
Filtert die zurückgegebenen Datensätze auf Grundlage der angegebenen Bedingung. |
Any() |
Ermittelt, ob die Auflistung Datensätze enthält. |
All(Bedingung) |
Ermittelt, ob alle Datensätze in der Auflistung die angegebene Bedingung erfüllen. |
- Weitere Informationen finden Sie unter Gewusst wie: Gruppieren und Aggregieren von Daten mithilfe des LinqDataSource-Steuerelements.
Aktualisieren, Einfügen und Löschen von Daten
Sie können das LinqDataSource-Steuerelement so konfigurieren, dass es die Befehle zum Aktualisieren, Einfügen und Löschen von Daten automatisch erstellt. Setzen Sie die Eigenschaft EnableUpdate, EnableInsert oder EnableDelete auf true, um die automatische Aktualisierung von Daten zu aktivieren.
Hinweis: |
---|
Wenn das LinqDataSource-Steuerelement automatisch Aktualisierungsbefehle generieren soll, dürfen Sie die Select-Eigenschaft nicht setzen. Wenn die Select-Eigenschaft gesetzt ist, gibt das LinqDataSource-Steuerelement ein Objekt zurück, das eine Instanz einer dynamischen Klasse ist. Es ist keine Instanz der Klasse, die die Datenbanktabelle darstellt. Deshalb kann die dynamische Klasse nicht herleiten, wie die Werte in der Datenbanktabelle aktualisiert werden. |
Wenn Sie zu aktualisierende Werte programmgesteuert setzen möchten, können Sie Ereignishandler für die Ereignisse Updating, Inserting oder Deleting erstellen. Im Handler können Sie vor dem Starten der Datenoperation einen Wert festlegen. Weitere Informationen finden Sie unter Gewusst wie: Aktualisieren, Einfügen und Löschen von Daten mit dem LinqDataSource-Steuerelement.
Sortieren von Daten
Das LinqDataSource-Objekt unterstützt zwei Möglichkeiten zum Sortieren von Daten einer Abfrage. Sie können die Daten beim Entwickeln der Webseite nach statischen Werten sortieren, Sie können den Benutzern auch ermöglichen, die Daten zur Laufzeit dynamisch zu sortieren.
Um die Daten nach statischen Werten zu sortieren, weisen Sie der OrderBy-Eigenschaft den Namen einer Eigenschaft zu. Damit die Benutzer die Daten zur Laufzeit sortieren können, setzen Sie die AutoSort-Eigenschaft auf true (den Standardwert). Übergeben Sie dem LinqDataSource-Steuerelement anschließend einen Sortierausdruck. Ein datengebundenes Steuerelement wie das GridView-Steuerelement übergibt einen Sortierausdruck, wenn die AllowSorting-Eigenschaft auf true gesetzt ist.
Um in der OrderBy-Eigenschaft mehrere Spaltennamen anzugeben, trennen Sie die Namen mit einem Komma. Wenn Sie beispielsweise "LastName, FirstName" angeben, werden die Datensätze zunächst nach LastName sortiert. Außerdem werden Datensätze, die im LastName-Feld identische Werte enthalten, nach FirstName sortiert.
Sie können beide Möglichkeiten der Sortierung verwenden, wenn Sie die Daten zunächst in einer bestimmten Reihenfolge zurückgeben und den Benutzern anschließend ermöglichen möchten, diese zu ändern. Hierzu setzen Sie die AutoSort-Eigenschaft auf true und die OrderBy-Eigenschaft auf den Namen einer Eigenschaft.
Das folgende Beispiel zeigt ein LinqDataSource-Steuerelement, das die Datensätze zunächst nach LastName, dann nach FirstName und schließlich nach MiddleName sortiert. Außerdem wird das LinqDataSource-Steuerelement so konfiguriert, dass Benutzer die Zeilen dynamisch sortieren können. Sie können ein Datensteuerelement wie das GridView-Steuerelement an das LinqDataSource-Steuerelement binden, um die Daten anzuzeigen und den Benutzern zu ermöglichen, eine Sortierreihenfolge anzugeben.
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Contact"
OrderBy="LastName, FirstName, MiddleName"
AutoSort="true"
ID="LinqDataSource1"
</asp:LinqDataSource>
Verwenden von Parametern zum dynamischen Auswerten von Werten
Beim Verwenden des LinqDataSource-Steuerelements geben Sie mit Parametern Werte an, die zur Laufzeit interpretiert oder konvertiert werden müssen. Im Unterschied zu anderen Datenquellensteuerelementen müssen Sie hierbei nicht jeden Wert angeben, der Teil der Aktualisierungs-, Einfüge- oder Löschoperation ist. Das LinqDataSource-Steuerelement legt diese Werte automatisch fest und generiert die SQL-Befehle mit LINQ to SQL. Sie geben Parameter nur an, um Standardwerte bereitzustellen oder leere Werte zu konvertieren. Außerdem können Sie Daten mit der WhereParameters-Parameterauflistung und der OrderByParameters-Parameterauflistung abhängig von Werten zur Laufzeit sortieren oder filtern. Weitere Informationen über LINQ to SQL finden Sie unter LINQ to SQL.
Das LinqDataSource-Steuerelement enthält die folgenden Parameterauflistungen:
Ein Beispiel, wie Sie die WhereParameters-Auflistung verwenden, um Benutzern das dynamische Filtern der Datensätze zu ermöglichen, die von einem LinqDataSource-Steuerelement zurückgegeben werden, finden Sie weiter oben in diesem Thema unter Filtern von Daten mit der Where-Klausel.
Parallelitätssteuerung
Wenn Sie Benutzern das Aktualisieren oder Löschen von Daten ermöglichen, möchten Sie möglicherweise sicherstellen, dass die Daten in der Datenquelle nicht von einem anderen Prozess geändert wurden, bevor Sie den Aktualisierungs- oder Löschvorgang fortsetzen. Wenn Sie nicht überprüfen, ob sich die Werte geändert haben, können Sie versehentlich Werte überschreiben, die von einem anderen Prozess festgelegt wurden, und die Daten in einen inkonsistenten Zustand versetzen.
Mit dem LinqDataSource-Steuerelement können Sie ermitteln, ob sich die Daten geändert haben. Das Steuerelement speichert die ursprünglichen Datenwerte im Ansichtszustand der Webseite. Beim Zurücksenden der Webseite enthält diese sowohl die ursprünglichen als auch die aktualisierten Werte. Das LinqDataSource-Steuerelement vergleicht die ursprünglichen Werte mit LINQ to SQL mit den Werten, die sich zu diesem Zeitpunkt in der Datenquelle befinden. Wenn die Werte identisch sind, wurden die Daten nicht geändert, und sie werden mit LINQ to SQL aktualisiert oder gelöscht. Wenn sich die Daten geändert haben, wird von LINQ to SQL eine Ausnahme ausgelöst.
Sie können manuell angeben, welche Spaltenwerte überprüft werden, indem Sie in der Entitätsklasse die UpdateCheck-Eigenschaft einer Spalte setzen. Wenn O/R-Designer Code für eine Datenbanktabelle generiert, wird die UpdateCheck-Eigenschaft für Spalten, die von der Datenbank verwaltet werden, auf Never festgelegt. Der Wert wird für alle anderen Spalten auf Always festgelegt, d. h. diese Spalten werden immer in einer Parallelitätsprüfung überprüft. Setzen Sie die UpdateCheck-Eigenschaft auf Never, um zu verhindern, dass für diese Spalte eine Parallelitätsprüfung erfolgt. Durch Festlegen der Eigenschaft auf Never wird auch verhindert, dass die Werte dieser Spalte im Ansichtszustand gespeichert werden. Setzen Sie die UpdateCheck-Eigenschaft auf WhenChanged, um den Wert nur anhand der Datenquelle zu überprüfen, wenn der Benutzer den Wert geändert hat.
Wenn Sie vertrauliche Daten im Ansichtszustand speichern müssen, sollten Sie den Ansichtszustand verschlüsseln. Weitere Informationen finden Sie unter Encrypt ViewState in ASP.NET 2.0.
Hinweis: |
---|
Das Verschlüsseln des Ansichtszustands kann die Leistung einer Webseite beeinflussen. |
Optimieren von Parallelitätsprüfungen für SQL Server-Daten
Das Speichern vieler Werte im Ansichtszustand kann den Umfang einer Webseite vergrößern und Benutzern möglicherweise vertrauliche Daten offen legen. Beim Arbeiten mit Daten einer SQL Server-Datenbank können Sie die Leistung und Sicherheit einer Webseite verbessern, indem Sie in der Datenbank eine Spalte mit einem Timestampwert erstellen. SQL Server aktualisiert eine Timestampspalte jedes Mal automatisch, wenn der Datensatz geändert wird. Dadurch muss das LinqDataSource-Steuerelement nicht alle Spalten eines Datensatzes zum Ermitteln vergleichen, ob der Datensatz geändert wurde. Stattdessen muss nur der Timestamp im Ansichtszustand mit dem Timestamp in der Datenbank verglichen werden.
Wenn Sie in einer SQL Server-Datenbank eine Timestampspalte hinzufügen, wird die Entitätsklasse vom O/R-Designer automatisch so erstellt, dass im Ansichtszustand nur der Timestamp gespeichert wird. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Verwenden eines Timestamps mit dem LinqDataSource-Steuerelement zum Überprüfen der Datenintegrität.
Verwenden von gespeicherten Prozeduren
Um mit dem LinqDataSource-Steuerelement Daten aus einer gespeicherten Prozedur abzurufen, müssen Sie einen Handler für das Selecting-Ereignis erstellen. Rufen Sie im Ereignishandler die Methode der Datenkontextklasse auf, die die gespeicherte Prozedur darstellt. Legen Sie dann das Ergebnis der gespeicherten Prozedur auf die Result-Eigenschaft des LinqDataSourceSelectEventArgs-Objekts fest. Wenn Sie automatische Aktualisierungs-, Einfüge- und Löschvorgänge aktivieren möchten, muss der von der Methode zurückgegebene Typ dem Typ entsprechen, der in der TableName-Eigenschaft angegeben ist.
Im folgenden Beispiel wird gezeigt, wie die Result-Eigenschaft dem Objekt zugewiesen wird, das von einer eine gespeicherte Prozedur repräsentierenden Methode zurückgegeben wurde.
Protected Sub LinqDataSource_Selecting(ByVal sender As Object, _
ByVal e As LinqDataSourceSelectEventArgs)
Dim exampleContext As ExampleDataContext = New ExampleDataContext()
e.Result = exampleContext.GetRegisteredCustomers()
End Sub
protected void LinqDataSource_Selecting(object sender,
LinqDataSourceSelectEventArgs e)
{
ExampleDataContext exampleContext = new ExampleDataContext();
e.Result = exampleContext.GetRegisteredCustomers();
}
Weitere Informationen zum Erstellen von Datenkontextmethoden finden Sie unter Gewusst wie: Erstellen von DataContext-Methoden, die gespeicherten Prozeduren und Funktionen (O/R-Designer) zugeordnet sind.
Überprüfen von Werten beim Ändern von Daten
Bevor Sie einen Datensatz ändern, ist es möglicherweise nötig, die Werte zu validieren. In der Regel werden Validierungen in der Datenklasse durchgeführt und nicht auf der Webseite. Die Bündelung von Validierungen in der Datenklasse stellt sicher, dass diese unabhängig von der Art der Verwendung der Datenklasse durchgeführt werden können. Weitere Informationen zum Hinzufügen von Validierungen zu einer Klasse finden Sie unter Gewusst wie: Hinzufügen von Validierungen zu Entitätsklassen und Exemplarische Vorgehensweise: Hinzufügen von Validierung zu Entitätsklassen.
Validierungsausnahmen werden ausgelöst, bevor Daten aktualisiert, eingefügt oder gelöscht werden. Sie können Handler für die Ereignisse Inserting, Updating und Deleting erstellen, um Validierungsausnahmen zu erhalten. Weitere Informationen finden Sie in den Ausführungen zu den Klassen LinqDataSourceUpdateEventArgs, LinqDataSourceInsertEventArgs und LinqDataSourceDeleteEventArgs.
Ereignisse des LinqDataSource-Steuerelements
Das LinqDataSource-Steuerelement löst an bestimmten Stellen seiner Verarbeitung Ereignisse aus, mit denen Sie anpassen können, wie Daten ausgewählt, eingefügt, aktualisiert oder gelöscht werden.
Beim Auswählen von Daten werden vom LinqDataSource-Steuerelement die folgenden Ereignisse (in der angegebenen Reihenfolge) ausgelöst:
ContextCreating (sofern erforderlich)
ContextCreated (sofern erforderlich)
Wenn Sie das Kontextobjekt im Selecting-Ereignis programmgesteuert erstellen und Sie im Ansichtzustand keine ursprünglichen Werte speichern müssen, werden das ContextCreating-Ereignis und das ContextCreated-Ereignis übersprungen.
Beim Aktualisieren, Einfügen oder Löschen von Daten werden vom LinqDataSource-Steuerelement die folgenden Ereignisse (in der angegebenen Reihenfolge) ausgelöst:
Die Reihenfolge der Ereignisse bei Aktualisierungs-, Lösch- und Einfügeoperationen unterscheidet sich von der bei Auswahloperationen. Dies liegt daran, dass das LinqDataSource-Steuerelement eine Instanz des Datenobjekts erhalten muss und diese Instanz an das Ereignis Inserting, Updating oder Deleting übergeben muss.
Die Ereignisse Selecting, Inserting, Updating und Deleting werden vor dem Ausführen der Datenoperation ausgelöst. Sie erstellen Ereignishandler für diese Ereignisse, um Werte vor der Operation zu überprüfen, zu ändern oder um die Operation abzubrechen. Wenn die Datenbank beispielsweise eine Spalte enthält, in der gespeichert wird, welcher Benutzer einen Datensatz zuletzt geändert hat, können Sie das Updating -Ereignis verwenden, um den Benutzernamen programmgesteuert zu setzen.
Die Ereignisse Selected, Inserted, Updated und Deleted werden nach dem Beenden der Operation ausgelöst. Sie erstellen Ereignishandler für diese Ereignisse, um Ausnahmen abzufangen und Werte zu überprüfen, die von der Operation zurückgegeben werden.
Das ContextCreating-Ereignis wird ausgelöst, bevor das LinqDataSource-Steuerelement den in der ContextTypeName-Eigenschaft angegebenen Typ erstellt. Sie behandeln dieses Ereignis, wenn Sie den Kontexttyp programmgesteuert erstellen möchten. Dies bietet sich beispielsweise an, wenn für die Konstruktormethode des Kontexttyps Parameter erforderlich sind. Das ContextCreated-Ereignis wird ausgelöst, nachdem der in der ContextTypeName-Eigenschaft angegebene Typ erstellt wurde. Sie behandeln dieses Ereignis, um Ausnahmen abzufangen oder um das erstellte Kontextobjekt zu untersuchen. Das ContextDisposing-Ereignis wird ausgelöst, bevor das LinqDataSource-Steuerelement den in der ContextTypeName-Eigenschaft angegebenen Kontexttyp entfernt. Sie behandeln dieses Ereignis, um das Verwerfen eines Objekts abzubrechen, dessen Erstellung (in Bezug auf Zeit oder Ressourcen) äußerst aufwendig ist. Sie können das Ereignis auch verwenden, um objektspezifische Bereinigungen durchzuführen, bevor das Objekt zerstört wird.
Zurück nach oben
Codebeispiele
Gewusst wie: Gruppieren und Aggregieren von Daten mithilfe des LinqDataSource-Steuerelements
Gewusst wie: Aktualisieren, Einfügen und Löschen von Daten mit dem LinqDataSource-Steuerelement
Zurück nach oben
Klassenreferenz
In der folgenden Tabelle sind die wesentlichen Klassen in Bezug auf die LinqDataSource-Klasse aufgelistet.
Member |
Beschreibung |
---|---|
Wendet LINQ-Ausdrücke auf eine Datenquelle an und stellt die Daten für datengebundene Steuerelemente dar. |
|
Unterstützt das LinqDataSource-Steuerelement und stellt eine Schnittstelle für datengebundene Steuerelemente zum Ausführen von Datenoperationen mit Datenobjekten bereit. Diese Klasse wurde insbesondere für die Verwendung durch datengebundene Steuerelemente entwickelt und nicht als programmierbares Objekt im Seitencode. |
|
Stellt Daten für das ContextDisposing-Ereignis bereit. |
|
Stellt Daten für das ContextCreating-Ereignis bereit. |
|
Stellt Daten für das Deleting-Ereignis bereit. |
|
Stellt Daten für das Inserting-Ereignis bereit. |
|
Stellt Daten für das Selecting-Ereignis bereit. |
|
Stellt Daten für die Ereignisse ContextCreated, Deleted, Inserted, Selected und Updated bereit. |
|
Stellt Daten für das Updating-Ereignis bereit. |
Zurück nach oben