Procédure pas à pas : Ajout de méthodes de requête
Cette procédure pas à pas décrit comment ajouter et personnaliser des méthodes dans les Services RIA WCF pour interroger une source de données. Ces méthodes, qui sont appelées des méthodes de requête, doivent être définies avec une signature que l'infrastructure reconnaît comme étant la spécification d'une méthode de requête. Les méthodes de requête satisfont cette exigence en appliquant l'objet QueryAttribute. Les signatures de requête attendues se divisent en deux catégories générales : les requêtes qui retournent toujours un type unique de Entity et les requêtes qui peuvent potentiellement retourner plusieurs types de Entity dans un objet IEnumerable ou IQueryable. Pour plus d'informations sur les signatures de méthode de requête autorisées, consultez Services de domaine.
Lorsque vous créez une classe DomainService et spécifiez ses entités dans la boîte de dialogue Ajouter une nouvelle classe de service de domaine, l'infrastructure des Services RIA crée automatiquement une méthode de requête simple dans cette classe pour chaque entité exposée par le service. Cette méthode de requête récupère simplement tous les enregistrements de l'entité. Cette procédure pas à pas décrit comment ajouter de nouvelles méthodes de requête qui exécutent des scénarios plus complexes tels que le filtrage par une valeur de paramètre. Cette procédure pas à pas indique comment ajouter des requêtes qui retournent une entité unique et également comment ajouter des requêtes qui retournent une collection d'entités.
Configuration requise
Cette procédure pas à pas, ainsi que les autres procédures du même type présentées dans la documentation des Services RIA , nécessite au préalable l'installation et la configuration correctes de plusieurs programmes, tels que Visual Studio 2010 et le Developer Runtime et SDK Silverlight, en plus des Services RIA WCF et du kit de ressources des Services RIA WCF. Ces procédures nécessitent également l'installation et la configuration de SQL Server 2008 R2 Express with Advanced Services et l'installation de la base de données AdventureWorks OLTP et LT.
Vous trouverez des instructions détaillées pour satisfaire chacune de ces conditions préalables dans les rubriques du nœud Conditions préalables pour les Services RIA WCF. Suivez ces instructions avant de poursuivre, pour être sûr de rencontrer le moins de problèmes possibles en effectuant ces procédures pas à pas des Services RIA .
Cette procédure pas à pas suppose que vous avez effectué celles décrites dans Procédure pas à pas : Création d'une solution de Services RIA et que vous disposez de la solution ainsi créée, prête à être modifiée par les procédures indiquées ici.
Pour ajouter une méthode de requête qui accepte un paramètre et retourne une entité unique
Ouvrez la solution générée dans la rubrique Procédure pas à pas : Création d'une solution de Services RIA qui expose des données de la table Customer.
Dans le projet serveur, ouvrez la classe DomainService
CustomerDomainService
qui expose les données de la table Customer.Ajoutez une méthode de requête qui accepte un paramètre entier et retourne l'entité
Customer
avec l'ID client correspondant.Si une méthode qui retourne une entité unique inclut l'attribut QueryAttribute, vous devez affecter à la propriété IsComposable la valeur false. Les utilisateurs ne peuvent pas spécifier d'opérations de requête supplémentaires à partir du client. Si votre méthode de requête correspond à la signature attendue pour une requête, il est inutile d'appliquer l'attribut QueryAttribute. La valeur de retour doit être une instance unique d'un objet 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); }
Pour ajouter une méthode de requête qui accepte un paramètre et retourne une collection d'entités
Ouvrez la classe DomainService qui expose les données de la table Customer.
Dans la classe DomainService
CustomerDomainService
, ajoutez une méthode de requête qui accepte un paramètre de chaîne et retourne tous les clients dont le nom commence par cette lettre.La méthode peut retourner un objet IQueryable, car l'utilisateur peut vouloir fournir une opération de requête supplémentaire à partir du 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); }
Pour afficher les résultats de ces méthodes de requête dans le projet client
Dans le projet client, ouvrez MainPage.xaml.
Ajoutez deux contrôles TextBox et deux contrôles Button afin que l'utilisateur puisse filtrer des enregistrements client soit par l'ID, soit par la première lettre du nom.
Le XAML suivant montre une disposition complète ainsi que le DataGrid existant.
<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>
Ouvrez la page code-behind de MainPage.xaml (MainPage.xaml.cs ou MainPage.xaml.vb).
Ajoutez le code pour récupérer les résultats de la requête basés sur l'entrée utilisateur.
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; } } }
Exécutez l'application (F5).
L'illustration suivante montre une liste de clients filtrée par nom qui s'affiche lors de l'exécution de l'application.