LINQ una buena alternativa Abril 2, 2008
Posted by elmercarias in .Net.Tags: .Net, linq
trackback
En las ultimas semanas he estado conociendo mas sobre las novedades de Visual Studio 2008, y una de las que mas me llama la atención es la tecnología LINQ, ya que ofrece mucha versatilidad para acceder los datos.
Pienso que es mas fácil de usar ya que no es necesario conocer mucho sobre SQL para realizar consultas complejas.
Como introducción les comento que LINQ ha sido creado para estandarizar el acceso a los datos, estos sean XML, una Base de Datos, ya sea Microsoft SQL Server, Oracle, Sybase etc.; así como tambien el manejo de Objetos en memoria. Esto es lo que mas llama la atención porque permitirá acostumbrarse a una sola sintaxis para acceder a los datos.
La manera mas fácil de tener acceso a objetos creados con LINQ, hay que adicionar a nuestro proyecto un nuevo Item llamado “LINQ to SQL”
Y en esta pantalla arrastrar los objetos que deseemos, en la imagen de ejemplo se utiliza la base de Datos Northwind,
Despues de seguir los pasos de previa configuración
Ejemplo #1:
Despues en cualquier ubicación de nuestra aplicación podemos hacer el siguiente ejemplo sencillo:
Dim query = from c in Customers
where c.Country = “Italy”
select c.CompanyName
El resultado de lo anterior es una Colección de Strings(que queda guardado en “query”), conteniendo los Nombres de Clientes(Customers) del país de Italia.
El query que genera y ejecuta es el siguiente:
Select CompanyName
From Customers
Where Country = “Italy”
Se preguntarán ¿Porque esta primero el FROM y despues el SELECT al escribirlo con LINQ?
Eso responde a que como .Net ofrece Intellisense en el SELECT y en el FROM es necesario decirle sobre que objeto se hará SELECT, y así el IDE nos ofrece el Intellisense.
El resultado obtenido en la variable “query” puede ser utilizado como origen de datos de un DropDownList, ListBox, etc.
Si notan en este primer ejemplo es completamente sencillo y no se ve la potencia de LINQ.
Ejemplo #2
En este ejemplo devolveremos los Clientes que tienen mas de 20 Ordenes de Compra(Orders) en el sistema
Dim query = from c in Customers
where c.Orders.Count > 20
select c.CompanyName
Esta ejecución genera el Query :
Select c0.CompanyName
From Customers AS c0
Where (Select Count(*)
From Orders AS c1
Where c1.CustomerID = c0.CustomerID
) > 20
En este ejemplo ya se empieza a ver que lo versatil de LINQ, ya que en sintaxis LINQ solamente se hace referencia a la relación con Orders y se utiliza la propiedad Count para comparar que sea mayor a 20,
si lo hubieramos hecho en SQL hubieramos que tenido que hacer el SubQuery para ese calculo.
Ejemplo #3
En este ejemplo a diferencia del anterior devolveremos las Ordenes de los Clientes que tienen mas de 20 Ordenes de Compra en el sistema
Dim query = from c in Customers
where c.Orders.Count > 20
select c.CompanyName, c.Orders
Esta ejecución genera los siguientes querys:
El primero es para devolver el listado principal de Compañias
SELECT [t0].[CompanyName], [t0].[CustomerID]
FROM [dbo].[Customers] AS [t0]
WHERE ((
SELECT COUNT(*)
FROM [dbo].[Orders] AS [t1]
WHERE [t1].[CustomerID] = [t0].[CustomerID]
)) > 20
El segundo es ejecutado para cada Customer del Query, en este caso son 3; esto es ejecutado en el RowDataBound del GridView donde se implementa el llenado de las Ordenes
SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate],
[t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight],
[t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion],
[t0].[ShipPostalCode], [t0].[ShipCountry]
FROM [dbo].[Orders] AS [t0]
WHERE [t0].[CustomerID] = @CustomerID
Bueno esto es un poco de lo que se puede hacer con LINQ, en este caso LINQ con SQL, en proxima entrega hablare de LINQ sobre XML y LINQ sobre Objetos.
Atte. Elmer Carías
“El fracaso tiene mil excusas, el éxito no requiere explicación.”
Estoy usando LINQ para un proyecto, mi duda es que lo veo muy dificil de implementar(asi he leido tambien) para una aplicacion de n-capas y aplicacion compleja asi que tenia unas preguntas.
Tambien mi duda es como funciona la conexion, siempre esta conectado el DataContext?
Cual es la forma de trabaja desconectado LINQ?
por ahi encontre esto
“My understanding of the LINQ to SQL DataContext is that it prefers to remain open. The primary reason for this is that its sole purpose in life is to track the state of it’s objects. As you add new objects into your collections, modify existing objects, or delete objects, the DataContext is tracking everything. Then you can all DataContext.SubmitChanges() and it will persist all of those changes into the database. ”
Lo verifique con SQL server 2008.
Como trabaja en si LINQ?
Trabaja similar al llenado de un dataset, no permanece conectado el DataContext solamente sirve para que LINQ sepa como llegar a la base de datos, y cuando uno agrega, actualiza o elimina registros se conecta hasta que ejecutamos SubmitChanges