csharp-que-es-linq

Qué es y cómo usar LINQ en C#

LINQ es un conjunto de características introducidas en .NET Framework 3.5 que nos permite realizar composiciones funcionales que trabajan sobre iterables.

Las consultas LINQ pueden ser escritas utilizando de dos formas indistintamente,

  • Sintaxis de expresiones de consulta (query syntax)
  • sintaxis de métodos (method syntax).

Ambas sintaxis son equivalentes en funcionalidad, y la elección entre una y otra depende de las preferencias del desarrollador y el contexto de uso.

LINQ es una de las maravillas de C#. Es muy muy potente. Tenéis que acostumbraros a usarlo en cuanto podáis porque es una joya.

Sintaxis de LINQ

LINQ se puede usar de dos formas principales en C#: con sintaxis de consulta y con sintaxis de métodos.

Sintaxis de métodos

La sintaxis de métodos utiliza métodos de extensión y lambdas para crear consultas.

int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var numerosPares = numeros.Where(numero => numero % 2 == 0);

Sintaxis de consulta

La sintaxis de consulta se asemeja a SQL y es más intuitiva para aquellos familiarizados con las consultas SQL.

int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var numerosPares = from numero in numeros
                   where numero % 2 == 0
                   select numero;

Operaciones comunes en LINQ

Filtrado

El filtrado se realiza utilizando el método Where.

var numerosPares = numeros.Where(numero => numero % 2 == 0);

Proyección

La proyección transforma los datos en una nueva forma. El método Select se utiliza para este propósito.

var cuadrados = numeros.Select(numero => numero * numero);

Ordenación

La ordenación se logra con los métodos OrderBy y OrderByDescending.

var ordenadosAsc = numeros.OrderBy(numero => numero);
var ordenadosDesc = numeros.OrderByDescending(numero => numero);

Agrupación

La agrupación se realiza con el método GroupBy.

var agrupados = numeros.GroupBy(numero => numero % 2 == 0 ? "Pares" : "Impares");

Agregación

La agregación resume los valores de una colección utilizando métodos como Count, Sum, Average, Min y Max.

int suma = numeros.Sum();
int cuenta = numeros.Count();
double promedio = numeros.Average();
int minimo = numeros.Min();
int maximo = numeros.Max();

LINQ a objetos

LINQ a objetos permite realizar consultas sobre colecciones en memoria como arrays y listas. Esta es la forma más común y básica de utilizar LINQ.

List<string> frutas = new List<string> { "Manzana", "Banana", "Cereza", "Durazno" };

var frutasConA = from fruta in frutas
                 where fruta.Contains("a")
                 select fruta;

foreach (var fruta in frutasConA)
{
    Console.WriteLine(fruta);
}

LINQ a XML

LINQ a XML permite consultar y manipular documentos XML de manera sencilla.

XDocument xmlDoc = XDocument.Load("frutas.xml");

var frutasConA = from fruta in xmlDoc.Descendants("fruta")
                 where fruta.Value.Contains("a")
                 select fruta;

foreach (var fruta in frutasConA)
{
    Console.WriteLine(fruta.Value);
}

LINQ a SQL

LINQ a SQL permite interactuar con bases de datos SQL Server utilizando una sintaxis LINQ.

DataContext db = new DataContext("connectionString");

var clientes = from cliente in db.GetTable<Cliente>()
               where cliente.Ciudad == "Madrid"
               select cliente;

foreach (var cliente in clientes)
{
    Console.WriteLine(cliente.Nombre);
}