Condividi tramite


Procedura dettagliata: aggiunta di metodi di query

In questa procedura dettagliata viene descritto come aggiungere e personalizzare i metodi in WCF RIA Services che eseguono una query su un'origine dati. Tali metodi, definiti metodi di query, devono essere definiti con una firma che il framework riconosce come specifica di un metodo di query. I metodi di query soddisfano questo requisito applicando l'oggetto QueryAttribute. Il set di firme di query previste è diviso in due ampie categorie: query che restituiscono sempre un solo tipo di oggetto Entity e query che possono potenzialmente restituire più oggetti Entity di tipo T in un oggetto IEnumerable o IQueryable. Per ulteriori informazioni sulle firme dei metodi di query consentite, vedere Servizi del dominio.

Quando si crea una nuova classe del servizio del dominio e si specificano le relative entità nella finestra di dialogo Aggiungi una nuova classe DomainService, il framework RIA Services crea automaticamente in questa classe un metodo di query semplice per ogni entità esposta dal servizio. Questo metodo di query recupera semplicemente tutti i record per l'entità. In questa procedura dettagliata viene descritto come aggiungere nuovi metodi di query che eseguono scenari più complessi come ad esempio l'applicazione di filtri in base a un valore del parametro. Nella procedura dettagliata viene illustrato come aggiungere query che restituiscono una sola entità nonché come aggiungere query che restituiscono una raccolta di entità.

Prerequisiti

Per l'esecuzione di questa e di altre procedure dettagliate descritte nella documentazione di RIA Services è necessario che siano installati e configurati correttamente alcuni programmi prerequisiti quali Visual Studio 2010 e Silverlight Developer Runtime e SDK, oltre a WCF RIA Services e a WCF RIA Services Toolkit. È inoltre richiesta l'installazione e la configurazione di SQL Server 2008 R2 Express with Advanced Services e l'installazione del database AdventureWorks OLTP e LT.

Le istruzioni dettagliate per soddisfare tali prerequisiti vengono fornite negli argomenti all'interno del nodo Prerequisiti per WCF RIA Services. Seguire tali istruzioni prima di continuare con questa procedura dettagliata in modo da assicurarsi che si verifichi il minor numero possibile di problemi durante l'esecuzione della procedura dettagliata di RIA Services .

Per questa procedura dettagliata si presuppone che siano state completate le procedure descritte in Procedura dettagliata: creazione di una soluzione Servizi RIA e che la soluzione creata sia pronta per essere utilizzata nelle procedure descritte nella presente sezione.

Per aggiungere un metodo di query che accetta un parametro e restituisce una sola entità

  1. Aprire la soluzione creata nell'argomento Procedura dettagliata: creazione di una soluzione Servizi RIA che espone i dati della tabella Customer.

  2. Nel progetto server aprire la classe del servizio del dominio CustomerDomainService che espone i dati della tabella Customer.

  3. Aggiungere un metodo di query che accetta un parametro intero e restituisce l'entità Customer con l'ID cliente corrispondente.

    Se un metodo che restituisce una sola entità include l'attributo QueryAttribute, è necessario impostare la proprietà IsComposable su false. Gli utenti non possono specificare ulteriori operazioni di query dal client. Se il metodo di query corrisponde alla firma prevista per una query, non è necessario applicare l'attributo QueryAttribute. Il valore restituito deve essere una sola istanza di un oggetto entità.

    <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);
    }
    

Per aggiungere un metodo di query che accetta un parametro e restituisce una raccolta di entità

  1. Aprire la classe del servizio del dominio che espone i dati della tabella Customer.

  2. Nella classe del servizio del dominio CustomerDomainService aggiungere un metodo di query che accetta un parametro di stringa e restituisce tutti i clienti il cui cognome inizia con tale lettera.

    Il metodo può restituire un oggetto IQueryable poiché l'utente può desiderare fornire un'ulteriore operazione di query dal client.

    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);
    }
    

Per visualizzare i risultati di tali metodi di query nel progetto client

  1. Nel progetto client aprire il file MainPage.xaml.

  2. Aggiungere due controlli TextBox e due controlli Button in modo tale che l'utente possa filtrare i record del cliente in base all'ID o alla prima lettera del cognome.

    Nel codice XAML seguente viene illustrato un layout completo insieme all'oggetto DataGrid esistente.

    <UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  
        x:Class="RIAServicesExample.MainPage"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="https://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. Aprire la pagina code-behind del file MainPage.xaml (MainPage.xaml.cs o MainPage.xaml.vb).

  4. Aggiungere il codice per recuperare i risultati della query in base all'input dell'utente.

    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. Eseguire (F5) l'applicazione.

    Nell'illustrazione seguente viene mostrato un elenco di clienti filtrati in base al cognome visualizzato quando viene eseguita l'applicazione.

    RIA_QueryMethods