Compartir a través de


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

  1. Abra la solución creada en el tema Tutorial: crear una solución de RIA Services que expone los datos de la tabla Customer.

  2. En el proyecto de servidor, abra la clase de servicio de dominio CustomerDomainService que expone los datos de la tabla Customer.

  3. 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

  1. Abra la clase de servicio de dominio que expone los datos de la tabla Customer.

  2. 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.

  1. En el proyecto de cliente, abra MainPage.xaml.

  2. 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>
    
  3. Abra la página de código subyacente para MainPage.xaml (MainPage.xaml.cs o MainPage.xaml.vb).

  4. 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;
            }
        }
    }
    
  5. 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.

    RIA_QueryMethods