Exemplarische Vorgehensweise: Auswählen und Filtern einer Teilmenge von Daten mit dem LinqDataSource-Steuerelement und dem GridView-Steuerelement

Aktualisiert: November 2007

Diese exemplarische Vorgehensweise veranschaulicht, wie mit einem LinqDataSource-Steuerelement eine Datenmenge erstellt wird, die nicht auf Werte einer einzelnen Datenbanktabelle beschränkt ist. Sie werden mit einem LinqDataSource-Steuerelement eine Teilmenge der Daten aus der Tabelle auswählen, neue Werte aus den ausgewählten Werten errechnen und Werte von verknüpften Tabellen abrufen. Sie werden außerdem filtern, welche Datensätze zurückgegeben werden. Mithilfe eines GridView-Steuerelements zeigen Sie dann den neuen Satz von Werten an.

Diese exemplarische Vorgehensweise veranschaulicht den Datenzugriff in erster Linie anhand der Werte der Tabelle Product der AdventureWorks-Beispieldatenbank. Die Tabelle Product enthält Spalten mit Fremdschlüsseln für andere Tabellen, und Sie werden Daten aus diesen verknüpften Tabellen abrufen.

Mit dem O/R-Designer erstellen Sie eine Klasse, die die Datenbanktabellen mit den Werten repräsentiert. Das LinqDataSource-Steuerelement interagiert mit dieser generierten Klasse, um Daten abzurufen und zu aktualisieren.

Vorbereitungsmaßnahmen

Zum Implementieren der Verfahren in dieser exemplarischen Vorgehensweise ist Folgendes erforderlich:

  • Visual Studio 2008 oder Visual Web Developer Express Edition.

  • Eine ASP.NET-Website.

  • SQL Server Express Edition. Sie können auch einen installierten SQL Server verwenden, jedoch müssen Sie an einigen der Prozeduren kleine Anpassungen vornehmen.

  • Die auf dem Computer installierte AdventureWorks-Datenbank. Die AdventureWorks-Datenbank können Sie unter SQL Server 2005 Samples and Sample Databases herunterladen.

  • Eine Verbindungszeichenfolge in der Website, die eine Verbindung mit der AdventureWorks-Datenbank herstellt.

Erstellen von Klassen zum Darstellen von Datenbankentitäten

Beim Arbeiten mit Datenbankdaten und dem LinqDataSource-Steuerelement erstellen Sie Klassen, die Datenbankentitäten darstellen. In Visual Studio 2008 können Sie diese Klassen mit einem Tool erstellen.

So erstellen Sie Klassen für AdventureWorks-Datenbanktabellen

  1. Wenn die Website nicht bereits über den Ordner App_Code verfügt, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf ASP.NET-Ordner hinzufügen, und klicken Sie dann auf App_Code.

  2. Klicken Sie mit der rechten Maustaste auf den Ordner App_Code, und klicken Sie dann auf Neues Element hinzufügen.

    Das Dialogfeld Neues Element hinzufügen wird angezeigt.

  3. Wählen Sie unter Von Visual Studio installierte Vorlagen die Vorlage LINQ to SQL-Klassen aus, benennen Sie die Datei AdventureWorks.dbml, und klicken Sie dann auf Hinzufügen.

    Der O/R-Designer wird angezeigt.

  4. Ziehen Sie im Server-Explorer die Tabelle Product (Produktion) ins Fenster O/R-Designer.

    Die Tabelle Product (Produktion) und ihre Spalten werden im Designerfenster als Entität mit dem Namen Product dargestellt.

  5. Ziehen Sie die Tabelle ProductSubCategory und die Tabelle UnitMeasure ins Designerfenster.

    Diese Tabellen und ihre Spalten werden als Entitäten im Designerfenster dargestellt. Die Beziehung zwischen Product und den zwei verknüpften Tabellen wird mit der punktierten Zeile angezeigt.

  6. Speichern Sie die Datei AdventureWorks.dbml.

  7. Öffnen Sie im Projektmappen-Explorer die Datei AdventureWorks.designer.cs oder AdventureWorks.designer.vb.

    Die Datei verfügt über Klassen mit den Namen AdventureWorksDataContext, Product, ProductSubCategory und UnitMeasure. Die Product-Klasse enthält die Eigenschaften ProductSubcategory, UnitMeasure und UnitMeasure1. Diese Eigenschaften werden als Fremdschlüssel markiert, indem das AssociationAttribute-Attribut verwendet wird. Sie geben Objekte zurück, die die Tabellen ProductSubCategory und UnitMeasure darstellen.

    Die UnitMeasure-Eigenschaft stellt die Fremdschlüsselbeziehung für den Wert in der Spalte SizeUnitMeasureCode dar. Die UnitMeasure1-Eigenschaft stellt den Fremdschlüssel für die Spalte WeightUnitMeasureCode dar.

Auswählen der abzurufenden Spalten

Wenn Sie für die Select-Eigenschaft keinen Wert angeben, gibt das LinqDataSource-Steuerelement alle Eigenschaften (Spalten) von der Klasse zurück, die die Datenbanktabelle darstellt.

So rufen Sie eine Teilmenge der Daten mit dem LinqDataSource-Steuerelement ab

  1. Erstellen Sie in Visual Studio eine neue ASP.NET-Webseite, und wechseln Sie zur Quellansicht.

  2. Ziehen Sie von der Registerkarte Daten der Toolbox ein LinqDataSource-Steuerelement auf das form-Element auf der Webseite.

    Sie können die ID-Eigenschaft LinqDataSource1 übernehmen.

  3. Legen Sie die ContextTypeName-Eigenschaft auf AdventureWorksDataContext fest.

    Die AdventureWorksDataContext-Klasse ist eine Datenkontextklasse, die die AdventureWorks-Datenbank darstellt. Sie enthält eine Eigenschaft für jede Tabelle in der Datenbank.

  4. Legen Sie dieTableName-Eigenschaft auf Products fest.

  5. Legen Sie die Select-Eigenschaft in folgender Art fest:

    new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
    

    Indem Sie die Select-Eigenschaft festlegen, beschränken Sie die Eigenschaften, die von der Products-Klasse abgerufen werden. Wenn Sie mehr als eine Eigenschaft aus einer Klasse auswählen, müssen Sie die Eigenschaften in den Operator new einschließen. Dies ist notwendig, weil das LinqDataSource-Steuerelement keine Instanz der Klasse zurückgibt, die in der TableName-Eigenschaft angegeben wurde. Stattdessen wird eine Instanz einer dynamisch erstellten Klasse zurückgegeben, die nur diese Eigenschaften enthält.

Filtern der abzurufenden Datensätze

Wenn Sie für die Where-Eigenschaft keinen Wert angeben, gibt das LinqDataSource-Steuerelement alle Datensätze der Datenbanktabelle zurück. Sie können die Datensätze filtern, die zurückgegeben werden, indem Sie die Where-Eigenschaft festlegen. Sie können über einen statischen Wert filtern, beispielsweise ListPrice > 0, um nur die Datensätze zurückzugeben, deren ListPrice-Eigenschaft einen Wert größer als 0 (null) hat. Sie können auch zur Laufzeit einen Wert zuweisen, indem Sie der WhereParameters-Auflistung Parameter hinzufügen.

So filtern Sie zur Laufzeit die Daten mit dem LinqDataSource-Steuerelement

  1. Fügen Sie ein DropDownList-Steuerelement zur Webseite hinzu, und legen Sie dessen AutoPostBack-Eigenschaft auf true fest.

    Ändern Sie den Standardnamen DropDownList1 nicht.

  2. Fügen Sie dem DropDownList1-Steuerelement vier Listenelemente hinzu, und legen Sie deren Werte auf 0, 25, 100 und 400 fest.

  3. Fügen Sie ein WhereParameters-Element zwischen das Start- und Endtag des LinqDataSource-Steuerelements ein.

  4. Fügen Sie der WhereParameters-Auflistung ein ControlParameter-Steuerelement hinzu.

  5. Legen Sie die ControlID-Eigenschaft des ControlParameter-Steuerelements auf DropDownList1, die Name-Eigenschaft auf SelectedPrice und die Type-Eigenschaft auf Int32 fest.

    Zur Laufzeit enthält der SelectedPrice-Parameter den ausgewählten Wert von DropDownList1.

  6. Legen Sie die Where-Eigenschaft auf ListPrice > @SelectedPrice fest, um nur die Datensätze auszuwählen, deren ListPrice-Wert größer ist als der Wert, den der Benutzer ausgewählt hat.

    Das folgende Beispiel enthält das deklarative Markup für das DropDownList-Steuerelement und das LinqDataSource-Steuerelement.

    <asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
      <asp:ListItem Value="0"></asp:ListItem>
      <asp:ListItem Value="25"></asp:ListItem>
      <asp:ListItem Value="100"></asp:ListItem>
      <asp:ListItem Value="400"></asp:ListItem>
    </asp:DropDownList>
    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="ListPrice > @SelectedPrice" 
      Select="new(Name, Size, StandardCost, ListPrice, DaysToManufacture)" 
      ID="LinqDataSource1" 
      >
      <WhereParameters>
        <asp:ControlParameter 
          Name="SelectedPrice" 
          DefaultValue="0" 
          ControlID="DropDownList1" 
          Type="Int32" />
      </WhereParameters>
    </asp:LinqDataSource>
    

Hinzufügen eines Steuerelements zum Anzeigen von Daten

Sie können nun ein GridView-Steuerelement hinzufügen und es an das LinqDataSource-Steuerelement binden. Mit dem GridView-Steuerelement können Benutzer Datenzeilen anzeigen, die vom LinqDataSource-Steuerelement verwaltet werden. Damit ermöglichen Sie Benutzern, die Daten zu sortieren und seitenweise zu durchsuchen.

So zeigen Sie die Teilmenge der Daten im GridView-Steuerelement an

  1. Doppelklicken Sie auf der Registerkarte Daten der Toolbox auf das GridView-Steuerelement, um es der Seite hinzuzufügen.

  2. Legen Sie die DataSourceID-Eigenschaft des GridView-Steuerelements auf LinqDataSource1 fest.

    Dies bindet das GridView-Steuerelement an die vom LinqDataSource-Steuerelement zurückgegebenen Daten.

  3. Legen Sie die AllowPaging-Eigenschaft und die AllowSorting-Eigenschaft auf true fest.

    Für das Sortieren und seitenweise Durchsuchen mithilfe des LinqDataSource-Steuerelements muss die AutoSort-Eigenschaft und die AutoPage-Eigenschaft auf true festgelegt sein. Standardmäßig sind diese beiden Werte true.

  4. Legen Sie die AutoGenerateColumns-Eigenschaft auf false fest.

  5. Die Reihenfolge der Spalten wird festgelegt, indem Sie ein BoundField-Steuerelement für jede Eigenschaft (Name, Size, StandardCost, ListPrice und DaysToManufacture) erstellen, die Sie in der Where-Eigenschaft des LinqDataSource-Steuerelements angegeben haben.

    Das folgende Beispiel enthält das deklarative Markup für das GridView-Steuerelement.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
            DataField="Name" 
            HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField 
            DataField="Size" 
            HeaderText="Size" 
            SortExpression="Size" />
        <asp:BoundField 
            DataField="StandardCost" 
            HeaderText="Standard Cost" 
            SortExpression="StandardCost" />
        <asp:BoundField 
            DataField="ListPrice" 
            HeaderText="List Price" 
            SortExpression="ListPrice" />
        <asp:BoundField 
            DataField="DaysToManufacture" 
            HeaderText="Days To Manufacture" 
            SortExpression="DaysToManufacture" />
      </Columns>
    </asp:GridView>
    
  6. Speichern Sie die Seite, und drücken Sie STRG+F5, um die Seite in einem Browser anzuzeigen.

    Das GridView-Steuerelement zeigt die Spalten der aktuellen Datensätze der Tabelle Product an. Sie können die Datensätze sortieren, indem Sie auf die Spaltenüberschriften klicken, und Sie können seitenweise durch die Datensätze blättern, indem Sie auf die Seitenzahlen klicken.

Verwenden von Werten der Datenquelle zum Berechnen neuer Werte

Über die reine Auswahl von Werten aus der Datenbanktabelle hinaus, können Sie neue Werte berechnen. Möglicherweise möchten Sie einen Wert ausgeben, der nur abgeleitet werden kann, indem eine Berechnung mit einem Wert aus der Datenquelle durchführt wird. Anschließend können Sie diese Werte im GridView-Steuerelement anzeigen.

So berechnen und zeigen Sie neue Werte der Datenquelle an

  1. Ändern Sie den Wert der Select-Eigenschaft folgendermaßen:

    new(Name, 
        Size, 
        StandardCost, 
        ListPrice, 
        ListPrice - StandardCost as PriceDifference, 
        DaysToManufacture / 5.0 as WeeksToManufacture)
    

    Die weiteren Werte, PriceDifference und WeeksToManufacture, sind in der Datenbank nicht vorhanden. Sie können erst angezeigt werden, nachdem eine Berechnung auf Basis der Werte in der Datenbank ausgeführt wurde.

  2. Fügen Sie dem GridView-Steuerelement die BoundField-Steuerelemente für die Spalten PriceDifference und WeeksToManufacture hinzu, und entfernen Sie das BoundField-Steuerelement für die Spalte DaysToManufacture.

    Das folgende Beispiel enthält das deklarative Markup für die berechneten BoundField-Steuerelemente.

        <asp:BoundField 
            DataField="PriceDifference" 
            HeaderText="Price Difference" 
            SortExpression="Price Difference" />
        <asp:BoundField 
            DataField="WeeksToManufacture" 
            HeaderText="Weeks To Manufacture" 
            SortExpression="WeeksToManufacture" />
    
  3. Speichern Sie die Seite, und drücken Sie STRG+F5, um die Seite in einem Browser anzuzeigen.

    Das GridView-Steuerelement zeigt die Spalten der aktuellen Datensätze und der errechneten Werte der Tabelle Product an.

Auswählen von Werten aus verknüpften Tabellen

Sie können mit einem LinqDataSource-Steuerelement sowohl die Werte einer Tabelle, wie auch die Werte jeder verknüpften Tabelle abrufen. Wenn für eine Tabelle Fremdschlüsselbeziehungen mit anderen Tabellen bestehen, generiert der O/R-Designer eine Entitätsklasse, die Eigenschaften für jede der verknüpften Tabellen enthält. Diese Eigenschaften geben ein Objekt zurück, das die verknüpfte Tabelle darstellt. Das Objekt enthält wiederum Eigenschaften für alle Spalten in der verknüpften Tabelle. Sie können Werte aus verknüpften Tabellen auswählen, indem Sie auf die Objekte in der Klasse zugreifen, die die verknüpften Tabellen darstellt.

So rufen Sie Daten aus verknüpften Tabellen ab

  1. Legen Sie die Select-Eigenschaft des LinqDataSource-Steuerelements folgendermaßen fest:

    new(Name, 
        Size, 
        UnitMeasure.Name as SizeMeasureName, 
        Weight, 
        UnitMeasure1.Name as WeightMeasureName, 
        ProductSubcategory.Name as SubCategoryName)
    

    Die Eigenschaften SizeMeasureName, WeightMeasureName und SubCategoryName enthalten Werte aus Tabellen, die Fremdschlüsselbeziehungen zu der Tabelle Products haben.

  2. Um nur die Produkte zurückzugeben, die eine Größen- oder Gewichtsmaßeinheit haben, legen sie die Where-Eigenschaft folgendermaßen fest:

    WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
    

    Das Filtern dieser Werte veranschaulicht die Verwaltung von Fremdschlüsselbeziehungen durch das LinqDataSource-Steuerelement. Der Operator || führt eine logische OR-Operation aus. Entsprechend werden nur Datensätze zurückgegeben, die einen Wert haben, der mindestens einem der Fremdschlüssel zugewiesen ist.

    Das folgende Beispiel enthält das deklarative Markup für das LinqDataSource-Steuerelement.

    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="WeightUnitMeasureCode != null || 
             SizeUnitMeasureCode != null"
      Select="new(Name,
                  Size, 
                  UnitMeasure.Name as SizeMeasureName, 
                  Weight, 
                  UnitMeasure1.Name as WeightMeasureName, 
                  ProductSubCategory.Name as SubCategoryName)" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    
  3. Fügen Sie im GridView-Steuerelement ein BoundField-Steuerelement für jede anzuzeigende Spalte hinzu. Dabei handelt es sich um die Spalten Name, Size, SizeMeasureName, Weight, WeightMeasureName, und SubCategoryName.

    Das folgende Beispiel enthält das deklarative Markup für das GridView-Steuerelement.

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
              DataField="Name" 
              HeaderText="Name" 
              SortExpression="Name" />
        <asp:BoundField 
              DataField="Size" 
              HeaderText="Size" 
              SortExpression="Size" />
        <asp:BoundField 
              DataField="SizeMeasureName" 
              HeaderText="Size Unit of Measurement" 
              SortExpression="SizeMeasureName" />
        <asp:BoundField 
              DataField="Weight" 
              HeaderText="Weight" 
              SortExpression="Weight" />
        <asp:BoundField 
              DataField="WeightMeasureName" 
              HeaderText="Weight Unit of Measurement" 
              SortExpression="WeightMeasureName" />
        <asp:BoundField 
              DataField="SubCategoryName" 
              HeaderText="Subcategory Name" 
              SortExpression="SubCategoryName" />
      </Columns>
    </asp:GridView>
    
  4. Speichern Sie die Seite, und drücken Sie STRG+F5, um die Seite in einem Browser anzuzeigen.

    Das GridView-Steuerelement zeigt die Werte aus den Tabellen Produkt, ProductSubCategory und UnitMeasure an. Sie können durch die Datensätze blättern und sie sortieren.

Nächste Schritte

In dieser exemplarischen Vorgehensweise haben Sie gelernt, wie Sie anpassen können, welche Spalten und Datensätze in einer Abfrage zurückgegeben werden, indem Sie das LinqDataSource-Steuerelement verwenden. Sie können dem LinqDataSource-Steuerelement weitere Funktionen hinzufügen, z. B. Folgendes:

Siehe auch

Konzepte

Übersicht über das LinqDataSource-Webserversteuerelement