Compartir a través de


Language Integrated Query (LINQ)

Language-Integrated Query (LINQ) es el nombre de un conjunto de tecnologías basadas en la integración de funcionalidades de consulta directamente en el lenguaje C#. Tradicionalmente, las consultas en los datos se expresan como cadenas simples sin comprobación de tipos en tiempo de compilación o compatibilidad con IntelliSense. Además, tiene que aprender un lenguaje de consulta diferente para cada tipo de origen de datos: bases de datos SQL, documentos XML, varios servicios web, etc. Con LINQ, una consulta es una construcción de lenguaje de primera clase, al igual que clases, métodos y eventos.

Al escribir consultas, la parte "integrada en lenguaje" más visible de LINQ es la expresión de consulta. Las expresiones de consulta se escriben en una sintaxis de consulta declarativa. Mediante la sintaxis de consulta, se realizan operaciones de filtrado, ordenación y agrupación en orígenes de datos con un mínimo de código. Use los mismos patrones de expresión de consulta para consultar y transformar datos de cualquier tipo de origen de datos.

En el ejemplo siguiente se muestra una operación de consulta completa. La operación completa incluye la creación de un origen de datos, la definición de la expresión de consulta y la ejecución de la consulta en una foreach instrucción .

// Specify the data source.
int[] scores = [97, 92, 81, 60];

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

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

// Output: 97 92 81

Es posible que tenga que agregar una using directiva, using System.Linq;, para que se compile el ejemplo anterior. Las versiones más recientes de .NET usan los usos implícitos para agregar esta directiva como un uso global. Las versiones anteriores requieren que lo agregue en su origen.

Información general sobre expresiones de consulta

  • Las expresiones de consulta extraen y transforman datos de cualquier fuente de datos compatible con LINQ. Por ejemplo, una sola consulta puede recuperar datos de una base de datos SQL y generar un flujo XML como salida.
  • Las expresiones de consulta usan muchas construcciones conocidas del lenguaje C#, lo que facilita su lectura.
  • Las variables de una expresión de consulta están fuertemente tipadas.
  • Una consulta no se ejecuta hasta que no se realiza la iteración a través de la variable de consulta, por ejemplo, en una instrucción foreach.
  • En tiempo de compilación, las expresiones de consulta se convierten en llamadas de método de operador de consulta estándar según las reglas definidas en la especificación de C#. Cualquier consulta que se pueda expresar mediante la sintaxis de consulta también se puede expresar mediante la sintaxis del método. En algunos casos, la sintaxis de consulta es más legible y concisa. En otros, la sintaxis del método es más legible. No hay ninguna diferencia semántica o de rendimiento entre las dos formas diferentes. Para obtener más información, consulte Especificación del lenguaje C# y Introducción a los operadores de consulta estándar.
  • Algunas operaciones de consulta, como Count o Max, no tienen ninguna cláusula de expresión de consulta equivalente y, por tanto, deben expresarse como una llamada de método. La sintaxis del método se puede combinar con la sintaxis de consulta de varias maneras.
  • Las expresiones de consulta se pueden compilar en árboles de expresión o en delegates, dependiendo del tipo al que se aplique la consulta. Las consultas IEnumerable<T> se compilan en delegados. IQueryable y IQueryable<T> las consultas se compilan en árboles de expresión. Para obtener más información, vea Árboles de expresión.

Habilitación de la consulta LINQ del origen de datos

Datos en memoria

Hay dos maneras de habilitar la consulta LINQ de datos en memoria. Si los datos son de un tipo que implementa IEnumerable<T>, se consultan los datos mediante LINQ to Objects. Si no tiene sentido habilitar la enumeración mediante la implementación de la IEnumerable<T> interfaz, defina los métodos del operador de consulta estándar LINQ, ya sea en ese tipo o como métodos de extensión para ese tipo. Las implementaciones personalizadas de los operadores de consulta estándar deben usar la ejecución diferida para devolver los resultados.

Datos remotos

La mejor opción para habilitar la consulta LINQ de un origen de datos remoto es implementar la IQueryable<T> interfaz.

Proveedores de LINQ de IQueryable

Los proveedores linq que implementan IQueryable<T> pueden variar ampliamente en su complejidad.

Un proveedor menos complejo IQueryable podría tener acceso a un único método desde un servicio web. Este tipo de proveedor es muy específico porque espera información específica en las consultas que controla. Tiene un sistema de tipos cerrado, quizás exponiendo un único tipo de resultado. La mayoría de la ejecución de la consulta se produce localmente, por ejemplo mediante las Enumerable implementaciones de los operadores de consulta estándar. Un proveedor menos complejo podría examinar solo una expresión de llamada de método en el árbol de expresiones que representa la consulta y permitir que la lógica restante de la consulta se controle en otro lugar.

Un IQueryable proveedor de complejidad media podría tener como destino un origen de datos que tenga un lenguaje de consulta parcialmente expresivo. Si tiene como destino un servicio web, podría tener acceso a más de un método del servicio web y seleccionar el método al que llamar en función de la información que busca la consulta. Un proveedor de complejidad media tendría un sistema de tipos más completo que un proveedor simple, pero seguiría siendo un sistema de tipos fijo. Por ejemplo, el proveedor podría exponer tipos que tienen relaciones uno a varios y que se pueden recorrer, pero no proporcionaría tecnología de asignación para tipos definidos por el usuario.

Un proveedor complejo IQueryable , como el proveedor de Entity Framework Core , podría traducir consultas LINQ completas a un lenguaje de consulta expresivo, como SQL. Un proveedor complejo es más general porque puede controlar una variedad más amplia de preguntas en la consulta. También tiene un sistema de tipos abiertos y, por lo tanto, debe contener una amplia infraestructura para asignar tipos definidos por el usuario. El desarrollo de un proveedor complejo requiere una cantidad significativa de esfuerzo.