Tutorial: agregar métodos de consulta
En este tutorial se describe cómo agregar y personalizar métodos en WCF RIA Services que consultan un origen de datos. Dichos métodos, que se conocen como métodos de consulta, se deben definir con una signatura que el marco reconoce como especificación de un método de consulta. Los métodos de consulta satisfacen este requisito mediante la aplicación de QueryAttribute. El conjunto de signaturas de consulta esperadas se divide en dos grandes categorías: las consultas que siempre devuelven un tipo único de Entity y las que pueden, potencialmente, devolver más de un elemento Entity de tipo T en un elemento IEnumerable o un elemento IQueryable. Para obtener más información sobre las signaturas de métodos de consulta permitidas, vea Servicios de dominio.
Cuando se crea una nueva clase de servicio de dominio y se especifican sus entidades en el cuadro de diálogo Agregar nueva clase de servicio de dominio, el marco de RIA Services crea automáticamente un método de consulta simple en esta clase para cada entidad expuesta por el servicio. Este método de consulta simplemente recupera todos los registros para la entidad. En este tutorial se describe cómo agregar nuevos métodos de consulta que realizan escenarios más complejos como el filtrado por un valor de parámetro. En él se muestra cómo agregar consultas que devuelven una entidad única y también cómo agregar consultas que devuelven una colección de entidades.
Requisitos previos
Este tutorial y los demás tutoriales presentados en la documentación de RIA Services requieren la instalación y configuración correctas de varios programas de requisitos previos, como Visual Studio 2010 y Silverlight Developer Runtime y SDK, además de WCF RIA Services y el Kit de herramientas de WCF RIA Services. También requieren la instalación y configuración de SQL Server 2008 R2 Express con Advanced Services, así como la instalación de las bases de datos OLTP y LT de AdventureWorks.
Los temas del nodo Requisitos previos para WCF RIA Services proporcionan instrucciones detalladas para el cumplimiento de cada uno de estos requisitos previos. Siga las instrucciones proporcionadas en ellos antes de realizar este tutorial para asegurarse de encontrar el menor número de problemas posibles al trabajar en estos tutoriales de RIA Services .
En este tutorial se supone que se han completado los procedimientos descritos en Tutorial: crear una solución de RIA Services y que se tiene preparada la solución creada en ellos para su modificación en los procedimientos que se describen aquí.
Para agregar un método de consulta que acepta un parámetro y devuelve una entidad única
Abra la solución creada en el tema Tutorial: crear una solución de RIA Services que expone los datos de la tabla Customer.
En el proyecto de servidor, abra la clase de servicio de dominio
CustomerDomainService
que expone los datos de la tabla Customer.Agregue un método de consulta que acepte un parámetro entero y devuelva la entidad
Customer
con el identificador de cliente correspondiente.Si un método que devuelve una entidad única incluye el atributo QueryAttribute, debe establecer la propiedad IsComposable en false. Los usuarios no pueden especificar operaciones de consulta adicionales desde el cliente. Si el método de consulta coincide con la signatura esperada para una consulta, no es necesario aplicar el atributo QueryAttribute. El valor devuelto debe ser una instancia única de un objeto entidad.
<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); }
Para agregar un método de consulta que acepta un parámetro y devuelve una colección de entidades
Abra la clase de servicio de dominio que expone los datos de la tabla Customer.
En la clase de servicio de dominio
CustomerDomainService
, agregue un método de consulta que acepte un parámetro de cadena y devuelva los clientes cuyo apellido empiece por esa letra.El método puede devolver un objeto IQueryable porque es posible que el usuario desee proporcionar operación de consulta adicional desde el cliente.
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); }
Para mostrar los resultados de esos métodos de consulta en el proyecto de cliente.
En el proyecto de cliente, abra MainPage.xaml.
Agregue dos controles TextBox y dos controles Button para que el usuario pueda filtrar los registros de cliente por identificador o por la primera letra del apellido.
El código XAML siguiente muestra un diseño completo junto con el control DataGrid existente.
<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>
Abra la página de código subyacente para MainPage.xaml (MainPage.xaml.cs o MainPage.xaml.vb).
Agregue código para recuperar resultados de la consulta basados en los datos proporcionados por el usuario.
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; } } }
Ejecute (F5) la aplicación.
La siguiente ilustración muestra una lista de clientes filtrada por el apellido que aparece cuando se ejecuta la aplicación.