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à
Aprire la soluzione creata nell'argomento Procedura dettagliata: creazione di una soluzione Servizi RIA che espone i dati della tabella Customer.
Nel progetto server aprire la classe del servizio del dominio
CustomerDomainService
che espone i dati della tabella Customer.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à
Aprire la classe del servizio del dominio che espone i dati della tabella Customer.
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
Nel progetto client aprire il file MainPage.xaml.
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>
Aprire la pagina code-behind del file MainPage.xaml (MainPage.xaml.cs o MainPage.xaml.vb).
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; } } }
Eseguire (F5) l'applicazione.
Nell'illustrazione seguente viene mostrato un elenco di clienti filtrati in base al cognome visualizzato quando viene eseguita l'applicazione.