Verwenden von LINQ mit ASP.NET

Aktualisiert: November 2007

Sie können die sprachintegrierte Abfrage (Language-Integrated Query, LINQ) auf Webseiten verwenden, um Daten abzurufen und zu ändern. LINQ wendet die Prinzipien der objektorientierten Programmierung auf relationale Daten an. Dabei wird ein einheitliches Programmiermodell zum Abfragen von Daten aus verschiedenen Typen von Datenquellen bereitgestellt, und die Datenfunktionen werden direkt auf die Sprachen C# und Visual Basic erweitert. Weitere Informationen finden Sie unter Sprachintegrierte Abfrage (Language-Integrated Query, LINQ).

Sie können LINQ über das LinqDataSource-Steuerelement, das ObjectDataSource-Steuerelement oder über das Erstellen von LINQ-Abfragen verwenden.

Wenn Sie LINQ in einer Webanwendung verwenden, müssen Sie die Richtliniendateien aus Gründen der Codezugriffssicherheit ggf. ändern. Diese Änderungen sind weiter unten in diesem Thema beschrieben.

LinqDataSource-Steuerelement

Mithilfe des LinqDataSource-Steuerelements können Sie aus einer Datenbank auf einfache Weise auf Daten oder auf eine speicherinterne Datenauflistung zugreifen, z. B. ein Array. Sie können alle Bedingungen deklarieren, die für häufige Szenarien wie das Abrufen, Filtern, Sortieren und Gruppieren von Daten erforderlich sind. Das Steuerelement erstellt die LINQ-Abfragen dynamisch aus den Werten, die Sie deklarativ bereitstellen.

Beim Abrufen von Daten aus einer LINQ to SQL-Datenkontextklasse können Sie auch ein LinqDataSource-Steuerelement zum Aktualisieren, Einfügen und Löschen von Vorgängen konfigurieren. Das Steuerelement ermöglicht dies, ohne dass Sie die SQL-Befehle zum Durchführen dieser Aufgaben selbst schreiben müssen.

Um die Daten auf einer Webseite anzuzeigen, binden Sie ein datengebundenes Steuerelement an das LinqDataSource-Steuerelement. Beispiele für datengebundene Steuerelemente sind GridView oder DetailsView.

Das folgende Beispiel zeigt das Markup für ein LinqDataSource-Steuerelement, das eine Verbindung zur Datenbank AdventureWorks herstellt. Es werden Datensätze aus der Tabelle Contact zurückgegeben, deren Wert in der EmailPromotion-Eigenschaft 1 entspricht.

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    Where="EmailPromotion=1"
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>

Weitere Informationen finden Sie unter Übersicht über das LinqDataSource-Webserversteuerelement.

ObjectDataSource-Steuerelement

Sie verwenden das ObjectDataSource-Steuerelement, wenn Sie mit den Daten auf komplexere Art interagieren möchten, als dies mit dem LinqDataSource-Steuerelement möglich ist. Sie können z. B. eine Aktualisierungsmethode erstellen, die auch das Festlegen von Werten in verknüpften Tabellen durchführt.

Sie können das ObjectDataSource-Steuerelement mit einer LINQ to SQL-Klasse verwenden. Legen Sie dazu die TypeName-Eigenschaft auf den Namen der Datenkontextklasse fest. Legen Sie außerdem die Methoden SelectMethod, UpdateMethod, InsertMethod und DeleteMethod auf die Methoden in der Datenkontextklasse fest, die die entsprechenden Vorgänge ausführen.

Wenn Sie für das ObjectDataSource-Steuerelement die verzögerte Ausführung von Abfragen verwenden, müssen Sie einen Ereignishandler für das ObjectDisposing-Ereignis erstellen, um das Freigeben der Datenkontextklasse abzubrechen. Dieser Schritt ist erforderlich, da LINQ to SQL die verzögerte Ausführung unterstützt, während das ObjectDataSource-Steuerelement versucht, den Datenkontext nach dem Auswahlvorgang freizugeben.

LINQ-Abfragen

Sie können LINQ-Abfragen in eine Webseite einbinden, ohne das Datenquellensteuerelement zu verwenden. Sie können eine LINQ-Abfrage verwenden, wenn Sie einen Abfrageoperator benötigen, der im LinqDataSource-Steuerelement nicht verfügbar ist. Sie können die Abfrage auch verwenden, wenn Sie schreibgeschützte Daten in einem datengebundenen Steuerelement ohne den Verarbeitungsaufwand anzeigen möchten, der zum Erstellen eines Datenquellensteuerelements erforderlich ist. Weitere Informationen zu LINQ-Operatoren finden Sie unter Übersicht über Standardabfrageoperatoren. Eine Liste der Abfrageoperatoren, die im LinqDataSource-Steuerelement verfügbar sind, finden Sie unter Übersicht über das LinqDataSource-Webserversteuerelement.

Das folgende Beispiel zeigt, wie Sie eine LINQ-Abfrage in eine Webseite einbinden. Das Beispiel zeigt die Ergebnisse der Abfrage in einem GridView-Steuerelement an.

[Visual Basic]

Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Dim dataContext As AdventureWorksDataContext = _
            New AdventureWorksDataContext()
        Dim query = From contact In dataContext.Contacts _
          Where contact.EmailPromotion = 1 _
          Select contact

        GridView1.DataSource = query
        GridView1.DataBind()
    End If
End Sub

[C#]

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        AdventureWorksDataContext dataContext = 
            new AdventureWorksDataContext();

        var query = from contact in dataContext.Contacts
          where contact.EmailPromotion==1
          select contact;

        GridView1.DataSource = query;
        GridView1.DataBind();
    }
}

LINQ und Codezugriffssicherheit

Die folgenden Abschnitte enthalten Informationen dazu, wie Sie LINQ bei mittlerer und hoher Vertrauensebene verwenden.

Verwenden von LINQ bei mittlerer Vertrauensebene

Um LINQ in einer Webanwendung zu verwenden, die mit mittlerer Vertrauensebene ausgeführt wird, müssen Sie zwei Elemente in die Richtliniendatei einfügen, die für die Medium-Vertrauensebene definiert ist. Standardmäßig ist die Datei web_mediumtrust.config die Richtliniendatei für die mittlere Vertrauensebene.

Fügen Sie im SecurityClasses-Element ein SecurityClass-Element mit den folgenden Attributen ein:

<SecurityClass 
  Name="ReflectionPermission" 
  Description="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

Fügen Sie im PermissionSet-Element, für das das Name-Attribut auf "ASP.Net" gesetzt ist, ein IPermission-Element hinzu, das über die folgenden Attribute verfügt:

<IPermission
  class="ReflectionPermission"
  version="1"
  Flags="RestrictedMemberAccess"
/>
Hinweis:

Die Elemente können ggf. während des Installationsprozesses hinzugefügt worden sein.

Verwenden von LINQ bei hoher Vertrauensebene

Um LINQ in einer Webanwendung zu verwenden, die mit hoher Vertrauensebene ausgeführt wird, müssen Sie ein Element in die Richtliniendatei einfügen, die für die High-Vertrauensebene definiert ist. Standardmäßig ist die Datei web_hightrust.config die Richtliniendatei für die hohe Vertrauensebene. Diese Datei enthält bereits ein IPermission-Element innerhalb eines PermissionsSet-Elements, das auf die ReflectionPermission-Klasse verweist. Sie müssen dieses Element ändern, wenn Sie LINQ verwenden.

Suchen Sie im PermissionSet-Element, für das das Name-Attribut auf "ASP.Net" gesetzt ist, nach dem IPermission-Element für ReflectionPermission, und legen Sie es wie folgt fest:

<IPermission
  class="ReflectionPermission"
  version="1"
  Flags="ReflectionEmit, RestrictedMemberAccess"
/>
Hinweis:

Dieses Element kann ggf. während des Installationsprozesses geändert worden sein.

Siehe auch

Konzepte

Übersicht über das LinqDataSource-Webserversteuerelement

Weitere Ressourcen

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)