LINQ to Entities y Visual Basic 2008 - Parte 1 - Jorge Serrano - MVP Visual Developer - Visual Basic

LINQ to Entities y Visual Basic 2008 - Parte 1

Visual Studio 2008

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):

Published 24/1/2008 19:00 por Jorge Serrano
Comparte este post:

Comentarios

Thursday, January 24, 2008 11:12 PM por Jorge Fernandez

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

Hola, el elemento ADO.NET Entity Data Model no aparece en mi VS2008, a que puede deberse?

# Futbol Argentino Mexicano y espanol » LINQ to Entities y Visual Basic 2008 - Parte 1

PingBack desde  Futbol Argentino Mexicano y espanol » LINQ to Entities y Visual Basic 2008 - Parte 1

Friday, January 25, 2008 7:35 AM por Jorge Serrano

# re: 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 geeks.ms/.../linq-to-entities-o-linq-to-sql.aspx.

En el blog de Juan Carlos, también encontrarás otra referencia sobre lo mismo: geeks.ms/.../ado-net-entity-framework-lo-que-necesitas-para-empezar.aspx

Espero que todo esto te ayude.

Si acaso ya nos contarás.

Un saludo.

Friday, January 25, 2008 8:19 AM por Juan Carlos González Martín

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

Hola Jorge!

Muy buena entrada y gracias por incluir mis post en la actualización que has hecho.

Un abrazo

JC's

Friday, January 25, 2008 10:35 AM por Octavio Hernández

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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

Friday, January 25, 2008 10:44 AM por Jorge Serrano

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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)

Friday, January 25, 2008 3:45 PM por Octavio Hernández

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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 :-)

Friday, January 25, 2008 5:48 PM por Jorge Serrano

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

¡Caramba!, y ¿a cuánto les pagabas la palabra?.

Muchas gracias a tus hijos también entonces. :-)

Saturday, January 26, 2008 1:04 AM por penyaskito

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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.

Saturday, January 26, 2008 7:48 AM por Jorge Serrano

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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 (es.wikipedia.org/.../ADO.NET en el que habla de clave extranejera y es.wikipedia.org/.../Integridad_de_datos en el que habla de clave ajena).

Muchas gracias por tu comentario.

Un saludo.

Tuesday, February 12, 2008 12:47 PM por El blog de Jorge

# LINQ to Entities y Visual Basic 2008 - n-capas - Parte 3

Introducción En las entradas anteriores que he tratado sobre LINQ, hemos visto inicialmente ( Parte 1

Monday, October 25, 2010 4:52 PM por andriuuuuu

# vb es de nenas

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

Monday, May 16, 2011 7:43 AM por Ziyad

# re: LINQ to Entities y Visual Basic 2008 - Parte 1

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