LINQ: descripción general

Los desarrolladores de todo el mundo siempre han encontrado problemas al consultar datos debido a la falta de una ruta definida y necesitan dominar múltiples tecnologías como SQL, Web Services, XQuery, etc.

Introducido en Visual Studio 2008 y diseñado por Anders Hejlsberg, LINQ (Language Integrated Query) permite escribir consultas incluso sin el conocimiento de lenguajes de consulta como SQL, XML, etc. Las consultas LINQ se pueden escribir para diversos tipos de datos.

Ejemplo de una consulta LINQ

C#

using System;
using System.Linq;

class Program {
   static void Main() {
   
      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
		
      //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;
	    
      //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }	 
		
      Console.ReadLine();
   }
}

VB

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
     
      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
     
      ' Print each word out.
	  
      For Each word In shortWords
         Console.WriteLine(word)
      Next
	  
      Console.ReadLine()
   End Sub
End Module

Cuando el código anterior de C # o VB se compila y ejecuta, produce el siguiente resultado:

hello 
LINQ 
world

Sintaxis de LINQ

Hay dos sintaxis de LINQ. Estos son los siguientes.

Sintaxis de Lamda (método)

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

Sintaxis de consulta (comprensión)

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

Tipos de LINQ

Los tipos de LINQ se mencionan brevemente a continuación.

  • LINQ to Objects
  • LINQ a XML (XLINQ)
  • LINQ to DataSet
  • LINQ a SQL (DLINQ)
  • LINQ para entidades

Aparte de lo anterior, también hay un tipo LINQ llamado PLINQ que es el LINQ paralelo de Microsoft.

Arquitectura LINQ en .NET

LINQ tiene una arquitectura de 3 capas en la que la capa superior consta de las extensiones de lenguaje y la capa inferior consta de fuentes de datos que suelen ser objetos que implementan interfaces genéricas IEnumerable <T> o IQueryable <T>. La arquitectura se muestra a continuación.

Expresiones de consulta

La expresión de consulta no es más que una consulta LINQ, expresada en una forma similar a la de SQL con operadores de consulta como Select, Where y OrderBy. Las expresiones de consulta suelen empezar con la palabra clave "De".

Para acceder a los operadores de consulta LINQ estándar, el espacio de nombres System.Query debe importarse de forma predeterminada. Estas expresiones están escritas dentro de una sintaxis de consulta declarativa que era C # 3.0.

A continuación se muestra un ejemplo para mostrar una operación de consulta completa que consiste en la creación de la fuente de datos, la definición de la expresión de la consulta y la ejecución de la consulta.

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {
      
         // Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

         // Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

         // Execute the query.
		 
         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }
		 
         Console.ReadLine();
      }
   }
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

97 92 81

Métodos de extensión

Introducidos con .NET 3.5, los métodos de extensión se declaran solo en clases estáticas y permiten la inclusión de métodos personalizados a los objetos para realizar algunas operaciones de consulta precisas para extender una clase sin ser un miembro real de esa clase. Estos también pueden estar sobrecargados.

En pocas palabras, los métodos de extensión se utilizan para traducir expresiones de consulta en llamadas a métodos tradicionales (orientadas a objetos).

Diferencia entre LINQ y el procedimiento almacenado

Existe una serie de diferencias entre LINQ y los procedimientos almacenados. Estas diferencias se mencionan a continuación.

  • Los procedimientos almacenados son mucho más rápidos que una consulta LINQ, ya que siguen un plan de ejecución esperado.

  • Es fácil evitar errores en tiempo de ejecución al ejecutar una consulta LINQ que en comparación con un procedimiento almacenado, ya que el primero tiene el soporte Intellisense de Visual Studio, así como la verificación de tipo completo durante el tiempo de compilación.

  • LINQ permite la depuración haciendo uso del depurador .NET que no es en el caso de procedimientos almacenados.

  • LINQ ofrece soporte para múltiples bases de datos en contraste con los procedimientos almacenados, donde es esencial volver a escribir el código para diversos tipos de bases de datos.

  • La implementación de una solución basada en LINQ es fácil y simple en comparación con la implementación de un conjunto de procedimientos almacenados.

Necesidad de LINQ

Antes de LINQ, era esencial aprender C #, SQL y varias API que unen ambas para formar una aplicación completa. Dado que, estas fuentes de datos y lenguajes de programación enfrentan un desajuste de impedancia; se siente una necesidad de codificación corta.

A continuación se muestra un ejemplo de cuántas técnicas diversas utilizaron los desarrolladores al consultar datos antes de la llegada de LINQ.

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

Curiosamente, fuera de las líneas de código destacadas, la consulta se define solo por las dos últimas. Con LINQ, la misma consulta de datos se puede escribir en un formato legible codificado por colores como el siguiente que se menciona a continuación y en muy poco tiempo.

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

Ventajas de LINQ

LINQ ofrece una serie de ventajas y, entre ellas, la principal es su poderosa expresividad que permite a los desarrolladores expresarse de forma declarativa. Algunas de las otras ventajas de LINQ se detallan a continuación.

  • LINQ ofrece resaltado de sintaxis que resulta útil para descubrir errores durante el tiempo de diseño.

  • LINQ ofrece IntelliSense, lo que significa escribir consultas más precisas fácilmente.

  • La escritura de códigos es bastante más rápida en LINQ y, por lo tanto, el tiempo de desarrollo también se reduce significativamente.

  • LINQ facilita la depuración debido a su integración en el lenguaje C #.

  • Ver la relación entre dos tablas es fácil con LINQ debido a su característica jerárquica y esto permite redactar consultas uniendo múltiples tablas en menos tiempo.

  • LINQ permite el uso de una sola sintaxis LINQ mientras consulta muchas fuentes de datos diversas y esto se debe principalmente a su base unitiva.

  • LINQ es extensible, lo que significa que es posible utilizar el conocimiento de LINQ para consultar nuevos tipos de fuentes de datos.

  • LINQ ofrece la posibilidad de unir varias fuentes de datos en una sola consulta, además de dividir problemas complejos en un conjunto de consultas breves fáciles de depurar.

  • LINQ ofrece una transformación sencilla para la conversión de un tipo de datos a otro, como transformar datos SQL en datos XML.