LINQ to Entities y Visual Basic 2008 – Parte 1
LINQ to Entities (L2E)
Resumen general de lo publicado sobre LINQ hasta el momento:
Información general sobre LINQ
LINQ to Objects
LINQ to XML
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):
Para el que quiera trabajar con LINQ to Entities desde VS 2008, leeros LINQ to Entities o LINQ to SQL que también indicaba como referencia en el inicio de esta entrada o por esta otra de Juan Carlos González (CIIN).
13 Responsesso far
Hola, el elemento ADO.NET Entity Data Model no aparece en mi VS2008, a que puede deberse?
PingBack desde Futbol Argentino Mexicano y espanol » LINQ to Entities y Visual Basic 2008 – Parte 1
Hola Jorge,
he actualizado en esta entrada un par de aspectos para cubrir tu pregunta y para agregar más información como la que ha agregado Juan Carlos (CIIN) en su blog.
Para poder trabajar con LINQ to Entities, tendrás que instalar Microsoft ADO.NET Entity Framework Beta 3 (actualmente aún no está en versión final).
Para más información al respecto, léete la entrada http://geeks.ms/blogs/jorge/archive/2007/12/11/linq-to-entities-o-linq-to-sql.aspx.
En el blog de Juan Carlos, también encontrarás otra referencia sobre lo mismo: http://geeks.ms/blogs/ciin/archive/2008/01/16/ado-net-entity-framework-lo-que-necesitas-para-empezar.aspx
Espero que todo esto te ayude.
Si acaso ya nos contarás.
Un saludo.
Hola Jorge!
Muy buena entrada y gracias por incluir mis post en la actualización que has hecho.
Un abrazo
JC’s
Hola, Jorgito!
Excelente post, y gracias por la referencia.
SUGERENCIA: También sería muy interesante que escribieras sobre LINQ to XML y las facilidades que da VB 9 que C# no tiene (literales, operadores…)
¡Viva VB!
Abrazo – Octavio
Jajajaja, perfecto Octavio, me parece perfecto.
P.D.: espero que no te importe que haga referencia al modelo de datos «made in Octavio».
Intentaré hacer lo que me pides después de escribir un par de cosas más sobre LINQ to Entities que tengo en la trastienda. 😉
De todos los modos, la entrada siguiente muestra (adelanto algo ya) un error que he encontrado con LINQ to Entities y el binding de los datos hacia un DataGridView por ejemplo, para que veas que aunque VB tiene cosas muy interesantes que no tiene C#, hay otras que nos hace bien VB y sí C# como es lo que hablaré próximamente. 😉
Abrazotes fenómeno.
Y… para el que no tenga el libro de LINQ de Octavio, ¡¡¡SE LO RECOMIENDO!!! (avisados quedáis)
Jorgito,
Claro que no me importa, ¡al contrario!
Curiosidad: el modelo puede ser «made in Octavio», pero la base de datos es «created by the Hernandez-Bunin family», ya que fueron mis hijos quienes introdujeron los datos a partir de una aplicación Windows Forms que yo les hice 🙂
¡Caramba!, y ¿a cuánto les pagabas la palabra?.
Muchas gracias a tus hijos también entonces. 🙂
Hola Jorge,
Me ha sorprendido que utilices «clave extranjera». ¿No debería ser «clave ajena»? Es lo más habitual en la literatura de bases de datos.
Sea como fuere, gracias por el artículo.
Hola penyaskito,
lo cierto es que yo siempre lo he oído citar de los dos modos, pero cuando estudié Bases de Datos en la Universidad, el profesor nos enseñó a decir de forma general clave extranjera y con esa palabra más que con clave ajena (que usaba creo recordar en el álgebra relacional y la normalización de base de datos) es con la que me he quedado.
Se me ha ocurrido investigar a raiz de tu comentario y estos enlaces son algunos de los que he encontrado (http://es.wikipedia.org/wiki/ADO.NET en el que habla de clave extranejera y http://es.wikipedia.org/wiki/Integridad_de_datos en el que habla de clave ajena).
Muchas gracias por tu comentario.
Un saludo.
Introducción En las entradas anteriores que he tratado sobre LINQ, hemos visto inicialmente ( Parte 1
lo dicho, quien use vb creo que se está confundiendo de profesion
y si se supone que vb es mejor que c# será porque os gusta programar mal con código que se trague todo lo que le echéis
en este ejemplo las mismas tablas y claves ajenas
¿cómo se hace para insertar datos en en la tabla Futbolista teniendo en cuenta las claves ajenas?
Gracias