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);
}