Exemplarische Vorgehensweise: Hinzufügen von Abfragemethoden

In dieser exemplarischen Vorgehensweise wird beschrieben, wie Sie Methoden zum Abfragen einer Datenquelle in WCF RIA Services hinzufügen und anpassen. Solche als Abfragemethoden bezeichneten Methoden müssen mit einer Signatur definiert werden, die vom Framework als Angabe einer Abfragemethode erkannt wird. Um diese Anforderung zu erfüllen, wird für Abfragemethoden das QueryAttribute angewendet. Der Satz erwarteter Abfragesignaturen wird in zwei allgemeine Kategorien unterteilt: Abfragen, die immer nur einen Entity-Typ zurückgeben, und Abfragen, die potenziell mehrere Entity-Instanzen vom Typ "T" in einer IEnumerable oder IQueryable zurückgeben können. Weitere Informationen zu den zulässigen Abfragemethodensignaturen finden Sie unter Domänendienste.

Wenn Sie eine neue Domänendienstklasse erstellen und die zugehörigen Entitäten im Dialogfeld Neue Domänendienstklasse hinzufügen angeben, erstellt das RIA Services -Framework in dieser Klasse automatisch eine einfache Abfragemethode für jede vom Dienst verfügbar gemachte Entität. Diese Abfragemethode ruft einfach alle Datensätze für die Entität ab. In dieser exemplarischen Vorgehensweise wird beschrieben, wie Sie neue Abfragemethoden für komplexere Szenarien hinzufügen, z. B. die Filterung nach einem Parameterwert. Es werden sowohl das Hinzufügen von Abfragen, die nur eine Entität zurückgeben, als auch das Hinzufügen von Abfragen, die eine Auflistung von Entitäten zurückgeben, erläutert.

Erforderliche Komponenten

Für diese und die anderen exemplarischen Vorgehensweisen in der RIA Services -Dokumentation müssen zusätzlich zu WCF RIA Services und dem WCF RIA Services-Toolkit mehrere erforderliche Programme installiert und korrekt konfiguriert werden, z. B. Visual Studio 2010, die Silverlight Developer-Laufzeit und das Silverlight-SDK. Zudem müssen Sie SQL Server 2008 R2 Express with Advanced Services installieren und konfigurieren und die AdventureWorks OLTP- und LT-Datenbanken installieren.

Ausführliche Anweisungen für jede dieser erforderlichen Komponenten finden Sie in den Themen unter Erforderliche Komponenten für WCF RIA Services. Folgen Sie den Anweisungen in diesen Themen, bevor Sie mit dieser exemplarischen Vorgehensweise fortfahren, um sicherzustellen, dass beim Ausführen der exemplarischen Vorgehensweisen für RIA Services so wenig Probleme wie möglich auftreten.

Diese exemplarische Vorgehensweise setzt voraus, dass Sie die in Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe beschriebenen Verfahren abgeschlossen haben und die dort erstellte Projektmappe in den folgenden Verfahren geändert werden kann.

So fügen Sie eine Abfragemethode hinzu, die einen Parameter akzeptiert und nur eine Entität zurückgibt

  1. Öffnen Sie die im Thema Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe erstellte Projektmappe, in der Daten aus der Tabelle "Customer" verfügbar gemacht werden.

  2. Öffnen Sie im Serverprojekt die CustomerDomainService-Domänendienstklasse, die Daten aus der Tabelle "Customer" verfügbar macht.

  3. Fügen Sie eine Abfragemethode hinzu, die einen ganzzahligen Parameter akzeptiert und die Customer-Entität mit der entsprechenden Kunden-ID zurückgibt.

    Wenn eine Methode, die nur eine Entität zurückgibt, das QueryAttribute-Attribut enthält, müssen Sie die IsComposable-Eigenschaft auf false festlegen. Benutzer können auf dem Client keine weiteren Abfragevorgänge angeben. Wenn die Abfragemethode der erwarteten Signatur für eine Abfrage entspricht, müssen Sie das QueryAttribute-Attribut nicht anwenden. Beim Rückgabewert muss es sich um eine einzelne Instanz eines Entitätsobjekts handeln.

    <Query(IsComposable:=False)>
    Public Function GetCustomersByID(ByVal customerID As Integer) As Customer
        Return Me.ObjectContext.Customers.SingleOrDefault(Function(c) c.CustomerID = customerID)
    End Function
    
    [Query(IsComposable=false)]
    public Customer GetCustomersByID(int customerID)
    {
        return this.ObjectContext.Customers.SingleOrDefault(c => c.CustomerID == customerID);
    }
    

So fügen Sie eine Abfragemethode hinzu, die einen Parameter akzeptiert und eine Auflistung von Entitäten zurückgibt

  1. Öffnen Sie die Domänendienstklasse, die Daten aus der Tabelle "Customer" verfügbar macht.

  2. Fügen Sie in der CustomerDomainService-Domänendienstklasse eine Abfragemethode hinzu, die einen Zeichenfolgenparameter akzeptiert und alle Kunden zurückgibt, deren Nachname mit diesem Buchstaben beginnt.

    Die Methode kann ein IQueryable-Objekt zurückgeben, da der Benutzer möglicherweise einen zusätzlichen Abfragevorgang auf dem Client angeben möchte.

    Public Function GetCustomersByLastNameLetter(ByVal startingLastNameLetter As String) As IQueryable(Of Customer)
        Return Me.ObjectContext.Customers.Where(Function(c) c.LastName.StartsWith(startingLastNameLetter) = True)
    End Function
    
    public IQueryable<Customer> GetCustomersByLastNameLetter(string startingLastNameLetter)
    {
        return this.ObjectContext.Customers.Where(c => c.LastName.StartsWith(startingLastNameLetter) == true);
    }
    

So zeigen Sie die Ergebnisse dieser Abfragemethoden im Clientprojekt an

  1. Öffnen Sie im Clientprojekt "MainPage.xaml".

  2. Fügen Sie zwei TextBox-Steuerelemente und zwei Button-Steuerelemente hinzu, damit der Benutzer Kundendatensätze nach der ID oder nach dem ersten Buchstaben des Nachnamens filtern kann.

    Das folgende XAML-Beispiel zeigt ein vollständiges Layout mit dem vorhandenen DataGrid.

    <UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  
        x:Class="RIAServicesExample.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="400">
    
        <Grid x:Name="LayoutRoot" Background="White">
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="25"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="0">
                <TextBlock Text="search by id: " ></TextBlock>
                <TextBox Name="IDValue" Width="50" ></TextBox>
                <Button Name="IDButton" Click="IDButton_Click" Content="Submit"></Button>
            </StackPanel>
            <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1">
                <TextBlock Text="search by name: "></TextBlock>
                <TextBox Name="LetterValue" Width="30"></TextBox>
                <Button Name="LetterButton" Click="LetterButton_Click" Content="Submit"></Button>
            </StackPanel>
    
          <data:DataGrid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Name="CustomerGrid"></data:DataGrid>
        </Grid>
    </UserControl>
    
  3. Öffnen Sie die CodeBehind-Seite für "MainPage.xaml" ("MainPage.xaml.cs" bzw. "MainPage.xaml.vb").

  4. Fügen Sie Code hinzu, um Abfrageergebnisse basierend auf der Benutzereingabe abzurufen.

    Imports RIAServicesExample.Web
    Imports System.ServiceModel.DomainServices.Client
    
    Partial Public Class MainPage
        Inherits UserControl
        Dim _customerContext As New CustomerDomainContext
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Private Sub LetterButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            IDButton.IsEnabled = False
            LetterButton.IsEnabled = False
            Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersByLastNameLetterQuery(LetterValue.Text), AddressOf CustomerLoadedCallback, Nothing)
            CustomerGrid.ItemsSource = loadOp.Entities
        End Sub
    
        Private Sub IDButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
            IDButton.IsEnabled = False
            LetterButton.IsEnabled = False
            Dim loadOp = Me._customerContext.Load(Me._customerContext.GetCustomersByIDQuery(IDValue.Text), AddressOf CustomerLoadedCallback, Nothing)
            CustomerGrid.ItemsSource = loadOp.Entities
        End Sub
    
        Public Sub CustomerLoadedCallback(ByVal loadOperation As LoadOperation(Of Customer))
            IDButton.IsEnabled = True
            LetterButton.IsEnabled = True
        End Sub
    End Class
    
    using System;
    using System.Windows;
    using System.Windows.Controls;
    using RIAServicesExample.Web;
    using System.ServiceModel.DomainServices.Client;
    
    namespace RIAServicesExample
    {
    
        public partial class MainPage : UserControl
        {
            private CustomerDomainContext _customerContext = new CustomerDomainContext();
    
            public MainPage()
            {
                InitializeComponent();
            }
    
            private void LetterButton_Click(object sender, RoutedEventArgs e)
            {
                IDButton.IsEnabled = false;
                LetterButton.IsEnabled = false;
                LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersByLastNameLetterQuery(LetterValue.Text), CustomerLoadedCallback, null);
                CustomerGrid.ItemsSource = loadOp.Entities;
            }
    
            private void IDButton_Click(object sender, RoutedEventArgs e)
            {
                IDButton.IsEnabled = false;
                LetterButton.IsEnabled = false;
                LoadOperation<Customer> loadOp = this._customerContext.Load(this._customerContext.GetCustomersByIDQuery(int.Parse(IDValue.Text)), CustomerLoadedCallback, null);
                CustomerGrid.ItemsSource = loadOp.Entities;
            }
    
            void CustomerLoadedCallback(LoadOperation<Customer> loadOperation)
            {
                IDButton.IsEnabled = true;
                LetterButton.IsEnabled = true;
            }
        }
    }
    
  5. Führen Sie die Anwendung aus (F5).

    Die folgende Abbildung zeigt eine nach dem Nachnamen gefilterte Liste von Kunden, die beim Ausführen der Anwendung angezeigt wird.

    RIA_QueryMethods