Por Alejandro Hidalgo Fernández

SILVERLIGHT DATA SERVICES

Lo primero será crear una solución para nuestra aplicación Silverlight 3.

Creamos una base de datos sencillita para nuestro ejemplo con un par de tablas. Como ejemplo tendremos una tabla para almacenar los juegos que tenemos en el almacén y en otra tabla las categorías en las que catalogamos nuestros juegos.

El script de la base de Datos de Ejemplo podeis descargarla junto al código fuente de la demo en la carpeta Script. Sino sabeis, como crear la base de datos, os podeis crear un archivo de base de datos .mdf y crear el par de tablas con la siguiente estructura:

Añadimos la relación entre la tabla Juegos y la de Categorias mediante el campo Categoria en Juegos como clave foránea.

A continuación, añadimos al proyecto web un ADO.NET Entity Data Model y lo llamamos Modelo.

Y seleccionamos generar desde una base de datos. En el siguiente ponemos nuestra connection string en caso de que no estuviera ya seleccionada. Luego seleccionamos las tablas que queremos y guardamos con el namespace  BaseDeDatosModelo.

Una vez que tenemos nuestro modelo creado, necesitaremos crear el servicio. Para ello añadimos un nuevo elemento ADO.NET Data Service. Y lo rellenamos de la siguiente forma:

public class Almacen : DataService<BaseDeDatosEntidades>

{

// This method is called only once to initialize service-wide policies.

public static void InitializeService(IDataServiceConfiguration config)

{

config.SetEntitySetAccessRule("*", EntitySetRights.All);

}

}

Si abrimos en el navegador el Nuevo servicio que hemos creado veremos un XML con las Entidades. Si como dirección introducimos “../Almacen.svc/Juegos” o “Categorias” veremos el resultado del Servicio para cada Entidad.

Seguiremos la demo en el proyecto Silverlight. Lo primero será cargar el servicio añadiendo un Web Service Reference y descubrir el servicio.

Una vez lo hemos agregado podemos ir al MainPage.xaml y añadir un DataGrid donde introduciremos los datos obtenidos del servicio:

<Controls:DataGridx:Name="datagrid" AutoGenerateColumns="False" CanUserSortColumns="False" SelectionMode="Single" RowDetailsVisibilityMode="VisibleWhenSelected" ItemsSource="{Binding}">

<Controls:DataGrid.Columns>

             <Controls:DataGridTextColumn Binding="{Binding Nombre}"/>

             <Controls:DataGridTextColumn Binding="{Binding Compañia}"/>

             <Controls:DataGridTextColumn Binding="{Binding Precio}"/>

<Controls:DataGridTextColumnBinding="{Binding Categorias.Nombre}" Header="Categoria"/>

<Controls:DataGridTextColumnBinding="{Binding Stock}" Header="Stock"/>

</Controls:DataGrid.Columns>

<Controls:DataGrid.RowDetailsTemplate>

             <DataTemplate>

             <StackPanel Orientation="Horizontal">

                    <Image Height="80" Source="{Binding Foto}" />

<TextBlock Width="400" TextWrapping="Wrap" Text="{Binding Descripcion}"/>

            </StackPanel>

             </DataTemplate>

</Controls:DataGrid.RowDetailsTemplate>

</Controls:DataGrid>

Por último necesitaremos llamar el servicio y realizar una consulta, cuyo resultado introduciremos en el DataGrid anteriormente creado. Para ello, en el code behind añadiremos:

BaseDeDatosEntidades servicio = new BaseDeDatosEntidades(new Uri("Almacen.svc", UriKind.Relative));

public MainPage()

{

InitializeComponent();

var consulta = (from juego in servicio.Juegos.Expand("Categorias")

                         where juego.Categorias.Nombre.Equals("Accion")

                         select juego) as DataServiceQuery<Juegos>;

consulta.BeginExecute((resultado) => datagrid.ItemsSource = consulta.EndExecute(resultado).ToList(),null);

}

Si no habeis trabajado con LinQ, lo que hacemos en el código anterior es una consulta LinQ que pide los Juegos al servicio y los expande con Categorias. En esta consulta nos quedamos sólo con los juegos que son de la categoría de “Acción”. Para lo que ya conocíais LinQ vereis que en este caso necesitamos definir el resultado como un DataServiceQuery. De tal manera que iniciemos una operación de red asíncrona para ejecutar nuestra consulta. La salida obtenida con el método EndExecute se lo asignamos a la fuente de datos de nuestro datagrid.

Código fuente del tutorial

Descargar tutorial y código fuente en C#
Descargar tutorial y código fuente en VB