Linq to Entities es una nueva extensión para Linq (.Net 3.5) que hace que programar contra bases de datos sea mas fácil que nunca reduciendo los errores de impedancia en las tablas, columnas, filas de las base de datos y nuestro modelo de objetos.
El problema hasta ahora era que había distintos lenguajes para consultar información de Active Directory, Bases de datos, XML, objetos, etc. Tenias que conocer el funcionamiento y la gramática de Xpath, LDAP y muchos otros según el almacenamiento de la información. Con LINQ este problema desaparece ya que nos proporciona una tecnología para acceder a cualquiera de las tecnologías mencionadas anteriormente usando un lenguaje y gramática comunes. De esta manera nuestro código se independiza de nuestra forma de almacenamiento de datos. Hoy podemos tener la información en una base de datos y mañana lo mismo en un fichero XML, de manera que la misma consulta funcione sin cambios.
Creando un Entity Data Model
Para usar Entity Framework es necesario tener instalado el Service Pack 1 de Visual Studio 2008. Una vez instalado ya podremos ver una nueva opción en el menú Add New Item (no se como se llama esta opción en castellano, creo que es Añadir Nuevo Elemento).
Para este ejemplo voy a usar una aplicación de consola con la base de datos Northwind para que resulte todo más sencillo. Los pasos a seguir son los siguientes:
-
Una vez creado el proyecto de aplicación de consola nos vamos al menú Project->Add New Item y seleccionamos ADO.NET Entity Data Model.
-
Le asignamos un nombre a nuestro Data Model, por ejemplo NorthWindModel.edmx y presionamos Add.
-
En la siguiente pantalla seleccionamos Generate From Database y damos Next
-
En la pantalla siguiente debemos indicar la cadena de conexión a nuestra base de datos, pudiendo elegir entre una ya creada o componer una nueva. Tenemos un check para guardar dicha cadena en nuestro fichero .config de la aplicación, pudiendo cambiarle también el nombre. Una vez realizados todos los cambios pulsamos Next
-
En la siguiente pantalla nos aparece una lista con las tablas, vistas y procedimientos almacenados. Seleccionamos Customers,Orders,Order Details y Products. Una vez añadidas pulsamos Finish y se genera nuestro Data Model.
Obtendremos algo parecido a esto:
Ejecutando consultas
Linq es un lenguaje muy parecido a SQL, la principal diferencia es que la cláusula FROM se encuentra al principio y el SELECT al final. Esto es así para que pueda funcionar correctamente el intellisense de Visual Studio. De esta manera intellisense sabe a que objeto nos estamos refiriendo y nos muestra sus propiedades según vamos escribiendo.
Un ejemplo muy sencillo:
static void Main(string[] args)
{
using (NorthwindEntities context = new NorthwindEntities())
{
var clientes = from p in context.Customers
select p;
foreach (Customers cliente in clientes)
{
Console.WriteLine(cliente.ContactName);
}
}
Console.ReadLine();
}
Explico brevemente el codigo:
-
using (NorthwindEntities context = new NorthwindEntities()) Con esta linea indicamos que vamos a usar el model que hemos creado anteriormente y gracias al using todas las operaciones se abriran y cerraran solas sin tener que preocuparnos por ello.
-
var clientes = from p in context.Customers select p; Es la query a ejecutar. Hace uso de los tipos anonimos (var). De esta manera se infiere el tipo del objeto en la parte izquierda a partir de la parte derecha. Esta consulta simplemente obtiene todos los registros guardados en Customers.
-
foreach (Customers cliente in clientes): Recorro el objeto clientes y voy mostrando el ContactName de cada uno de los objetos Customer que contiene.
Si quiesemos que nos cargase tambien los objetos de tipo Order relacionados con Customers tenemos dos opciones:
-
Cargarlos directamente en nuestra consulta usando el metodo .Include():
var clientes = from p in context.Customers.Include(“Orders”)
select p;
Se pueden encadenar los includes, pero hay que ser cuidadoso con este sistema pues puede llegar a realizar cargas muy lentas y bloquear la ejecución.
-
Cargarlo mediante codigo, de esta manera se puede cargar solamente si se cumple una condicion, comprobar si no esta ya cargado, etc.
foreach (Customers cliente in clientes)
{
cliente.Orders.Load();
}




