CSharp

Tutorial CSharp: LINQ básico

Aprende LINQ básico en C# para realizar consultas declarativas sobre colecciones y simplificar el manejo de datos con ejemplos prácticos.

Aprende CSharp y certifícate

LINQ básico

LINQ (Language Integrated Query) es una característica de C# que permite realizar consultas sobre colecciones de datos de forma declarativa, similar a SQL. Esta funcionalidad integrada en el lenguaje nos permite escribir consultas de manera más legible y expresiva, reduciendo la cantidad de código necesario para manipular datos.

La sintaxis de consulta de LINQ se asemeja a SQL, lo que facilita su aprendizaje si ya estás familiarizado con bases de datos. Con LINQ podemos filtrar, ordenar, agrupar y transformar datos de diferentes fuentes como arrays, listas, diccionarios y otras colecciones.

Sintaxis básica de LINQ

La sintaxis de consulta LINQ sigue un patrón que comienza con la palabra clave from y termina generalmente con una cláusula select. Esta estructura puede parecer invertida respecto a SQL, pero tiene sentido cuando consideramos que necesitamos especificar primero la fuente de datos.

La estructura básica es:

var consulta = from elemento in coleccion
               where condicion
               orderby propiedad
               select resultado;

Veamos un ejemplo sencillo:

// Definimos una colección de números
int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// Consulta LINQ para obtener números pares
var numerosPares = from num in numeros
                   where num % 2 == 0
                   select num;

// Recorremos los resultados
foreach (var numero in numerosPares)
{
    Console.WriteLine(numero);
}

Este código muestra todos los números pares de la colección. La consulta se lee casi como una frase: "de los números, donde el número módulo 2 es igual a cero, selecciona el número".

Operadores básicos de LINQ

LINQ proporciona varios operadores que nos permiten manipular colecciones de datos. Veamos los más comunes:

Filtrado con where

El operador where nos permite filtrar elementos basados en una condición:

string[] nombres = { "Ana", "Juan", "Pedro", "María", "José" };

var nombresCortos = from nombre in nombres
                    where nombre.Length <= 4
                    select nombre;

// Resultado: Ana, Juan, José

Proyección con select

El operador select nos permite transformar los elementos de la colección:

string[] frutas = { "manzana", "pera", "plátano", "naranja" };

var longitudNombres = from fruta in frutas
                      select fruta.Length;

// Resultado: 7, 4, 7, 7 (longitud de cada nombre)

También podemos crear objetos anónimos:

var detallesFrutas = from fruta in frutas
                     select new { 
                         Nombre = fruta, 
                         Longitud = fruta.Length 
                     };

foreach (var detalle in detallesFrutas)
{
    Console.WriteLine($"{detalle.Nombre}: {detalle.Longitud} letras");
}

Ordenamiento con orderby

El operador orderby nos permite ordenar los resultados:

var frutasOrdenadas = from fruta in frutas
                      orderby fruta
                      select fruta;

// Resultado: manzana, naranja, pera, plátano (orden alfabético)

Para ordenar de forma descendente:

var frutasOrdenDesc = from fruta in frutas
                      orderby fruta descending
                      select fruta;

// Resultado: plátano, pera, naranja, manzana

Trabajando con colecciones de objetos

LINQ es especialmente útil cuando trabajamos con colecciones de objetos. Veamos un ejemplo:

// Definimos una clase Producto
public class Producto
{
    public int Id { get; set; }
    public string Nombre { get; set; }
    public decimal Precio { get; set; }
    public string Categoria { get; set; }
}

// Creamos una lista de productos
List<Producto> productos = new List<Producto>
{
    new Producto { Id = 1, Nombre = "Laptop", Precio = 1200, Categoria = "Electrónica" },
    new Producto { Id = 2, Nombre = "Teléfono", Precio = 800, Categoria = "Electrónica" },
    new Producto { Id = 3, Nombre = "Mesa", Precio = 350, Categoria = "Muebles" },
    new Producto { Id = 4, Nombre = "Silla", Precio = 120, Categoria = "Muebles" },
    new Producto { Id = 5, Nombre = "Auriculares", Precio = 80, Categoria = "Electrónica" }
};

// Consulta para obtener productos de electrónica ordenados por precio
var electronicos = from p in productos
                   where p.Categoria == "Electrónica"
                   orderby p.Precio descending
                   select p;

foreach (var producto in electronicos)
{
    Console.WriteLine($"{producto.Nombre} - ${producto.Precio}");
}

Operadores de agrupación

LINQ también nos permite agrupar datos utilizando el operador group by:

var productosPorCategoria = from p in productos
                            group p by p.Categoria into grupoCat
                            select new { 
                                Categoria = grupoCat.Key, 
                                Productos = grupoCat 
                            };

foreach (var grupo in productosPorCategoria)
{
    Console.WriteLine($"Categoría: {grupo.Categoria}");
    foreach (var producto in grupo.Productos)
    {
        Console.WriteLine($"  - {producto.Nombre}: ${producto.Precio}");
    }
}

Operadores de agregación

LINQ proporciona varios métodos de agregación como Count(), Sum(), Average(), Min() y Max():

// Contar productos de electrónica
var cantidadElectronicos = (from p in productos
                           where p.Categoria == "Electrónica"
                           select p).Count();

// Precio promedio de los muebles
var precioPromedioMuebles = (from p in productos
                            where p.Categoria == "Muebles"
                            select p.Precio).Average();

Console.WriteLine($"Cantidad de productos electrónicos: {cantidadElectronicos}");
Console.WriteLine($"Precio promedio de muebles: ${precioPromedioMuebles}");

Combinando operadores

Podemos combinar varios operadores LINQ para crear consultas más complejas:

var resumen = from p in productos
              group p by p.Categoria into grupoCat
              select new { 
                  Categoria = grupoCat.Key, 
                  CantidadProductos = grupoCat.Count(), 
                  PrecioPromedio = grupoCat.Average(p => p.Precio),
                  PrecioTotal = grupoCat.Sum(p => p.Precio)
              };

foreach (var item in resumen)
{
    Console.WriteLine($"Categoría: {item.Categoria}");
    Console.WriteLine($"  Cantidad: {item.CantidadProductos}");
    Console.WriteLine($"  Precio promedio: ${item.PrecioPromedio}");
    Console.WriteLine($"  Valor total: ${item.PrecioTotal}");
}

Ejecución diferida

Un aspecto importante de LINQ es que las consultas tienen ejecución diferida. Esto significa que la consulta no se ejecuta cuando se define, sino cuando se itera sobre los resultados:

// Definimos la consulta
var consulta = from p in productos
               where p.Precio > 100
               select p;

// Añadimos un nuevo producto a la lista
productos.Add(new Producto { Id = 6, Nombre = "Monitor", Precio = 250, Categoria = "Electrónica" });

// Al iterar sobre la consulta, incluirá el nuevo producto
foreach (var producto in consulta)
{
    Console.WriteLine(producto.Nombre);
}

Si necesitamos ejecutar la consulta inmediatamente y almacenar los resultados, podemos usar métodos como ToList() o ToArray():

// Ejecución inmediata y almacenamiento de resultados
var resultados = (from p in productos
                 where p.Precio > 100
                 select p).ToList();

// Añadir un nuevo producto no afectará a 'resultados'
productos.Add(new Producto { Id = 7, Nombre = "Teclado", Precio = 50, Categoria = "Electrónica" });

LINQ es una herramienta fundamental en C# que simplifica enormemente el trabajo con colecciones de datos, permitiéndonos escribir código más limpio, legible y mantenible.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende CSharp online

Ejercicios de esta lección LINQ básico

Evalúa tus conocimientos de esta lección LINQ básico con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de CSharp

Accede a todas las lecciones de CSharp y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A C#

Introducción Y Entorno

Creación De Proyecto C#

Introducción Y Entorno

Variables Y Constantes

Sintaxis

Tipos De Datos

Sintaxis

Operadores

Sintaxis

Control De Flujo

Sintaxis

Funciones

Sintaxis

Estructuras De Control Iterativo

Sintaxis

Interpolación De Strings

Sintaxis

Estructuras De Control Condicional

Sintaxis

Manejo De Valores Nulos

Sintaxis

Clases Y Encapsulación

Programación Orientada A Objetos

Objetos

Programación Orientada A Objetos

Constructores Y Destructores

Programación Orientada A Objetos

Herencia

Programación Orientada A Objetos

Polimorfismo

Programación Orientada A Objetos

Genéricos

Programación Orientada A Objetos

Métodos Virtuales Y Sobrecarga

Programación Orientada A Objetos

Clases Abstractas

Programación Orientada A Objetos

Interfaces

Programación Orientada A Objetos

Propiedades Y Encapsulación

Programación Orientada A Objetos

Métodos De Extensión

Programación Orientada A Objetos

Clases Y Objetos

Programación Orientada A Objetos

Clases Parciales

Programación Orientada A Objetos

Miembros Estáticos

Programación Orientada A Objetos

Tuplas Y Tipos Anónimos

Programación Orientada A Objetos

Arrays Y Listas

Colecciones Y Linq

Diccionarios

Colecciones Y Linq

Conjuntos, Colas Y Pilas

Colecciones Y Linq

Uso De Consultas Linq

Colecciones Y Linq

Linq Avanzado

Colecciones Y Linq

Colas Y Pilas

Colecciones Y Linq

Conjuntos

Colecciones Y Linq

Linq Básico

Colecciones Y Linq

Delegados Funcionales

Programación Funcional

Records

Programación Funcional

Expresiones Lambda

Programación Funcional

Linq Funcional

Programación Funcional

Fundamentos De La Programación Funcional

Programación Funcional

Pattern Matching

Programación Funcional

Testing Unitario Con Xunit

Testing

Excepciones

Excepciones

Delegados

Programación Asíncrona

Eventos

Programación Asíncrona

Lambdas

Programación Asíncrona

Uso De Async Y Await

Programación Asíncrona

Tareas

Programación Asíncrona

Accede GRATIS a CSharp y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender la sintaxis básica de LINQ y su similitud con SQL.
  • Aprender a utilizar operadores fundamentales como where, select y orderby.
  • Saber cómo trabajar con colecciones de objetos y aplicar consultas LINQ.
  • Entender el uso de operadores de agrupación y agregación en LINQ.
  • Conocer el concepto de ejecución diferida y cómo controlar la ejecución de consultas.