LINQ to Entities y Visual Basic 2008 - Parte 1
LINQ to Entities (L2E)
Resumen general de lo publicado sobre LINQ hasta el momento:
Después de haber visto introductoriamente LINQ to DataSet y LINQ to SQL, ahora le toca el turno a LINQ to Entities dentro del paradigma de LINQ y ADO.NET.
Recordando el modelo de Microsoft .NET Framework 3.5, observamos que LINQ to Entities (LINQ sobre Entidades) se encuentra dentro de LINQ y ADO.NET. El diagrama general de la arquitectura LINQ es el siguiente:

Mientras que LINQ to SQL es utilizado para trabajar con fuentes de datos SQL Server, LINQ to Entities es utilizado fundamentalmente (además de por otras razones) para trabajar con múltiples fuentes de datos.
Para desarrollar el siguiente ejemplo de introducción a LINQ to Entities al igual que en el caso del ejemplo de LINQ to SQL, vamos a utilizar el modelo de datos utilizado en el excelente libro de Octavio Hernández "C# 3.0 y LINQ”.
Iniciaremos un nuevo proyecto de VB utilizando como plantilla la plantilla de aplicación para Windows y agregaremos un nuevo elemento en el proyecto.
El nuevo elemento será de tipo ADO.NET Entity Data Model y de extensión edmx. A ese elemento le daremos el nombre de Futbol2006 como se indica en la siguiente imagen:

Nada más insertar este elemento, se iniciará un asistente con el cual podremos agregar las tablas, vistas y procedimientos almacenados de la fuente de datos con la que queremos trabajar.
En mi caso agregaré la fuente de datos de FUTBOL2006 y las tablas de la base de datos.
Una vez hecho esto, veremos que por un lado se agregan al proyecto los ensamblados necesarios para trabajar con datos y LINQ, y por otro lado, aparece en pantalla un diseñador de los objetos relacionales seleccionados.

Como podremos observar, las relaciones entre tablas aparecen dentro del diagrama del modelo de datos de entidades. Cada entidad queda perfectamente representada y como aspecto adicional, veremos que se establecen unas relaciones entre tablas de manera tal que la clave extranjera de una tabla aparezca en el apartado Navigation Properties de la entidad.
Partiendo por lo tanto de este modelo de entidades, vamos a trabajar ahora con él.
Dentro del formulario, vamos a agregar un control ComboBox (cboClubs), un control Button (btnSelectPlayers) y un control DataGridView (dgvPlayers).
Nuestro ejemplo en ejecución mostrará los jugadores de un club de futbol.
A continuación, vamos a escribir el siguiente código:
|
Imports LINQtoEntities.Futbol2006Model
Public Class MainForm
' Declaramos el contexto para usarlo en todo el programa Private contexto As New Futbol2006DataContext()
Private Sub btnSelectPlayers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelectPlayers.Click ' Recuperamos la información que queremos buscar Dim codeClub As String = Me.cboClubs.SelectedValue.ToString() ' Obtenemos los datos de Futbolistas segel equipo seleccionado Dim datos = From p In contexto.Futbolista _
Where p.Club.Codigo = Me.codeClub _
Select p.Id, p.Nombre, p.Sexo, p.FechaNacimiento, CodigoPaisNacimiento = p.Pais.Codigo, _
CodigoClub = p.Club.Codigo, p.Posicion _ OrderBy Id, Nombre, Sexo, FechaNacimiento, CodigoPaisNacimiento, CodigoClub, p.Posicion ' Volcamos los datos en el DataGridView Me.dgvPlayers.DataSource = datos ' Ajustamos los datos al control Me.dgvPlayers.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells) End Sub
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Ejecutamos el mpara cargar los Clubs de Futbol LoadClubs() End Sub
Private Sub LoadClubs() ' Cargamos los Clubs de Futbol Dim datos = From p In contexto.Clubs Select p.Codigo, p.Nombre Me.cboClubs.DataSource = datos ' Indicamos el valor a mostrar Me.cboClubs.DisplayMember = "Nombre" ' Indicamos el co clave asociado al valor mostrado Me.cboClubs.ValueMember = "Codigo" End Sub
End Class |
El resultado de ejecutar nuestra aplicación de ejemplo es el que se indica a continuación:

Ahora bien, si observamos con atención esta pantalla y el código escrito, y en concreto la instrucción Select p.Id, p.Nombre, p.Sexo, p.FechaNacimiento, CodigoPaisNacimiento = p.Pais.Codigo, CodigoClub = p.Club.Codigo, p.Posicion, veremos que el orden de los campos mostrados en el DataGridView no es el que esperábamos, o al menos no el que nos gustaría obtener. Además tenemos también una claúsula OrderBy que indicaría teóricamente un orden. ¿Porqué se da este comportamiento?.
Esto lo dejaremos así hasta la siguiente entrega que será dentro de muy poco.
Actualización de esta entrada (25/01/2008):