WCF Ria Services V1.0 para Silverlight 4.- Filtrar datos desde el DomainService (Parte 4)

Ahora bien, una vez que hemos enlistado la información desde la base datos, en esta entrada veremos cómo filtrar este resultado, es decir, mostrar solo los datos que cumplen cierto criterio. Índice:
Introducción (Parte 1)
Obtener datos desde la BD (Parte 2)
Mostrar datos (Parte 3)
Filtrar datos [DomainService] (Parte 4)

Modificando el Servicio de Dominio (DomainService)

En la parte 2, de esta serie de post, agregamos nuestra Clase de Servicio de Dominio, la cual llamamos RiaDomainService.cs. Esta clase, como ya lo explicábamos, es la encargada de exponer las diferentes acciones que podemos ejecutar desde y hacia nuestros datos.

El primer paso que haremos es agregar un nuevo método que nos permita filtrar los datos. Al hacerlo de esta manera, el filtrado de datos lo estaremos haciendo en la capa media, que bien podríamos ver como la capa de negocio (business).

Básicamente nuestro método será muy parecido al método que ya tenemos para obtener la lista de productos, pero este nuevo método recibirá un parámetro el cual usaremos para el filtrado de datos. En esta ocasión lo que haremos es filtrar los datos por los registros que comiencen con el texto que el usuario decida sobre la columna de nombre de producto.

El método lo llamaremos GetProductsStartingWith, y recibirá un texto como parámetro el cual llamaremos startingName. Y los datos serán filtrados utilizando el método Where() que nuestro modelo de datos no entrega, en el cual utilizaremos expresiones lambda.

public IQueryable<Product> GetProductsStartingWith(string startingName)
{
    return this.ObjectContext.Products.Where(p => p.Name.StartsWith(startingName));
}

Vista y Ventana de Fuente de Datos (Data Sources Window)

Al igual que cuando agregamos la lista de productos, el Data Source Window nos permite agregar los controles que en esta ocasión serán necesarios para mostrar la lista filtrada; el DataGrid, un cuadro de texto, y un botón, es una sola acción.

Para lograr esto, en el Data Source Window necesitamos indicar que para la lista de productos, el query a utilizar será GetProductsByNameQuery.

WCFRiaServices401

* Si el query no está disponible, es probable que necesitemos recompilar nuestra solución una vez que agregamos el nuevo método a nuestro DomainService, o presionar el icono de recargar disponible en la ventana de Data Source.

Una vez que hemos seleccionado el query solo bastará arrastrar el elemento a nuestro xaml.

WCFRiaServices402

Ejecutando la aplicación

Nuevamente, nuestra aplicación ya está terminada con apenas estos pequeños pasos que hemos hecho.

Aquí la explicación de lo que ha sucedido en nuestro archivo xaml.

Los elementos agregados: un DomainDataSource, un DataGrid, un Label, un TextBox, y un Button.

El primer elemento que necesitamos analizar es el DomainDataSource. Éste tiene los valores de acuerdo a:

  • Es generado con un nombre (Name=”productDomainDataSource”),
  • utiliza la función de GetProducts (QueryName="GetProductsByNameQuery"),
  • que no serán cargado automáticamente (AutoLoad="False")
  • y al ser cargados los datos, ejecutará el método productDomainDataSource_LoadedData (LoadedData="productDomainDataSource_LoadedData")

Adicionalmente, al DomainDataSource se le ha agregado un elemento llamado QueryParameters, el cual nos permite enviarle los parámetros pertinentes al query que estamos ejecutando, que en esta ocasión será:

  • el parámetro startingName (ParameterName="startingName")
  • cual será leído desde el textbox startingNameTextBox, que también ha sido agregado y analizaremos más adelante (Value="{Binding ElementName=startingNameTextBox, Path=Text}").
<riaControls:DomainDataSource AutoLoad="False"
                              d:DesignData="{d:DesignInstance my1:Product, CreateList=true}"
                              Height="0"
                              LoadedData="productDomainDataSource_LoadedData"
                              Name="productDomainDataSource"
                              QueryName="GetProductsStartingWithQuery"
                              Width="0">
    <riaControls:DomainDataSource.DomainContext>
        <my:RiaDomainContext />
    </riaControls:DomainDataSource.DomainContext>
    <riaControls:DomainDataSource.QueryParameters>
        <riaControls:Parameter ParameterName="startingName"
                               Value="{Binding ElementName=startingNameTextBox, Path=Text}" />
    </riaControls:DomainDataSource.QueryParameters>
</riaControls:DomainDataSource>

Además, como lo podemos observar, se han agregado un Label, un Textbox, un Button y un DataGrid, los cuales son muy intuitivos en su función. Básicamente el texto que el usuario escriba en el TextBox servirá como filtro de los datos a mostrar en el DataGrid, una vez presionado el Button. Y esto es ejecutado ya que se ha agregado un enlace (Binding) al Domain Data Source (Command="{Binding Path=LoadCommand, ElementName=productDomainDataSource}")

<StackPanel Height="30"
            Orientation="Horizontal">
    <sdk:Label Content="Starting Name:"
               Margin="3"
               VerticalAlignment="Center" />
    <TextBox Name="startingNameTextBox"
             Width="60" />
    <Button Command="{Binding Path=LoadCommand, ElementName=productDomainDataSource}"
            Content="Load"
            Margin="3"
            Name="productDomainDataSourceLoadButton" />
</StackPanel>

Otra forma de hacer filtros…

En el siguiente post, veremos cómo hacer filtrados de datos desde nuestro DomainDataSource, esto sin necesidad de modificar nuestros Servicios de Dominio…

Saludos…