Cheatsheet de C# LINQ y Expresiones: Sintaxis de Consulta y Métodos
Domina C# Language Integrated Query (LINQ), ejecución diferida (IEnumerable vs IQueryable), proyecciones Select/SelectMany, agrupaciones GroupBy y uniones de datos de alto rendimiento.
Respuesta rápida: ¿qué es LINQ en C#?
LINQ (Language Integrated Query) es la forma integrada de C# para consultar colecciones en memoria, bases de datos y otras fuentes con una misma sintaxis, sin escribir bucles manuales para filtrar, ordenar, agrupar o proyectar datos.
Tienes dos sintaxis equivalentes: la sintaxis de consulta (from … where … select) y la sintaxis de métodos (Where, Select, OrderBy, GroupBy). La consulta no se ejecuta hasta que la recorres o la materializas con ToList() o ToArray(): eso es la ejecución diferida que resume esta cheatsheet.
Para profundizar, consulta la Guía Maestra de C# LINQ y Rendimiento en Memoria y el resto de guías de la categoría C#.
1. Essential LINQ Transformations
LINQ operators use deferred execution until materialized by ToList(), ToArray(), or enumeration via foreach.
// Filtering and transforming collections
var highValueCustomers = customers
.Where(c => c.IsActive && c.TotalPurchases > 1000)
.OrderByDescending(c => c.TotalPurchases)
.Select(c => new { c.Id, c.FullName, Tier = "VIP" })
.ToList();
// GroupBy aggregation
var salesByCategory = orders
.GroupBy(o => o.Category)
.Select(g => new { Category = g.Key, TotalRevenue = g.Sum(x => x.Price) });
2. C# Records and Value Equality
Records provide built-in value-based equality, concise syntax, and safe immutability for domain models and DTOs.
// Positional record declaration with immutable properties
public record Developer(string Name, string Language, int ExperienceYears);
// Non-destructive mutation using 'with' expression
var dev1 = new Developer("Alex", "C#", 5);
var dev2 = dev1 with { Language = "F#" };
// Value-based equality check (returns true)
bool areEqual = dev1 == new Developer("Alex", "C#", 5);
3. Memory Optimization with ReadOnlySpan<T>
ReadOnlySpan allows slicing contiguous memory without triggering heap allocations or garbage collection pressure.
// Zero-allocation string parsing using ReadOnlySpan
string log = "2026-09-12|ERROR|ServiceUnavailable";
ReadOnlySpan<char> span = log.AsSpan();
int firstDelimiter = span.IndexOf('|');
ReadOnlySpan<char> dateSpan = span.Slice(0, firstDelimiter);
ReadOnlySpan<char> rest = span.Slice(firstDelimiter + 1);
int secondDelimiter = rest.IndexOf('|');
ReadOnlySpan<char> levelSpan = rest.Slice(0, secondDelimiter);
🚀 Ruta de Aprendizaje y Modelos de Negocio Asociados
Guía Maestra de C# LINQ & Rendimiento en Memoria
Ejecución diferida, proyecciones avanzadas y optimización de memoria con Spans.
Leer Guía Completa →Modernización de Código Legacy con IA ($2,500/mes)
Migra sistemas empresariales monolíticos a microservicios modernos en .NET 9.
Ver Plan de Negocio →¿Necesitas otra hoja de trucos?
Añadimos nuevas guías de referencia cada semana según las peticiones de la comunidad.
Solicitar una Cheatsheet →Preguntas frecuentes sobre LINQ en C#
¿Qué es LINQ en C#?
LINQ (Language Integrated Query) permite escribir consultas directamente en C# sobre colecciones, bases de datos y otras fuentes de datos, con comprobación de tipos en tiempo de compilación y sin depender de cadenas de texto para la consulta.
¿Cuál es la diferencia entre sintaxis de consulta y sintaxis de métodos?
Ninguna en resultado: ambas se compilan a las mismas llamadas a operadores. La sintaxis de consulta (from … where … select) se lee como SQL y resulta cómoda para filtros y uniones; la sintaxis de métodos (Where, Select, GroupBy) es la única que cubre todos los operadores, como Take, Skip o FirstOrDefault.
¿Qué significa la ejecución diferida en LINQ?
Que definir una consulta no la ejecuta: el trabajo ocurre cuando la enumeras con foreach o la materializas con ToList() o ToArray(). Por eso una consulta construida sobre una colección que cambia después refleja esos cambios al enumerarla, y por eso conviene materializarla cuando necesitas una foto fija de los datos.
¿Cuándo usar IEnumerable y cuándo IQueryable?
Usa IEnumerable para colecciones en memoria, donde la consulta se ejecuta en tu proceso. Usa IQueryable frente a una base de datos u otro proveedor remoto, donde la consulta se traduce (por ejemplo, a SQL) y se ejecuta en la fuente. La guía maestra de LINQ desarrolla ambos casos con ejemplos de rendimiento.