01

Qué es y qué problema resuelve

Una consulta eficiente recupera los datos necesarios con trabajo acotado. Antes de cambiar de herramienta mide duración, filas, viajes y SQL.

N+1 aparece cuando recorres resultados y consultas relaciones una por una; los datos pequeños pueden ocultarlo durante desarrollo.

02

Ejemplo paso a paso

Consultas eficientes, paginación y medición · caso de reservasC#

Punto de partida Primera página acotada. Para continuar implementa un cursor o una política de offset; comprueba DateTimeOffset con tu proveedor.

Antes de ejecutar

Requiere un proyecto con EF Core 10, proveedor elegido, DbContext y entidades configurados. db, ct e identificadores representan dependencias del caso. El ZIP de consola no contiene esta integración. Verifica el esquema y las garantías con el proveedor.

var pagina = await db.Reservas.AsNoTracking()
    .Where(r => r.GrupoId == grupo && !r.Cancelada)
    .OrderBy(r => r.Inicio).ThenBy(r => r.Id)
    .Select(r => new { r.Id, r.Inicio })
    .Take(Math.Clamp(limite, 1, 50)).ToListAsync(ct);

Cómo funciona

  1. Sigue el filtro autorizado antes de proyectar o materializar.
  2. Selecciona solo los campos necesarios y un orden estable.
  3. Limita la página y observa SQL, filas obtenidas y viajes a la base.

Resultado esperado: Como máximo 50 resultados, dos campos y orden determinista.

03

Cuándo usarlo y qué debes evitar

Ordena de manera estable antes de paginar. Un offset profundo puede exigir saltar muchas filas; un cursor por valores ordenados ayuda a continuar.

Un índice debe corresponder a filtros y orden reales. Una caché agrega invalidación e identidad de grupo: no uses una clave compartida para datos de usuarios distintos.

Ampliación opcional · contexto y variantes del tema

Proyectar, paginar y medir la consulta

Para leer, proyecta los campos necesarios antes de materializar. AsNoTracking evita mantener seguimiento cuando no vas a modificar las entidades; una proyección a escalares ya reduce la carga de seguimiento. Include carga relaciones: úsalo para el resultado que necesitas, no para todas las navegaciones. Una consulta por cada fila suele causar N+1: cuenta viajes y examina el SQL con datos representativos.

La paginación por offset es sencilla pero puede degradarse con páginas profundas. Un cursor basado en (Inicio, Id) permite continuar con orden estable si ambos valores se incluyen en el contrato. El máximo de página se valida en servidor; no basta confiar en un número enviado por el cliente. Para tareas pesadas define límites y presupuesto de tiempo antes de agregar caché. Una caché multiusuario debe incluir el grupo en la clave y tener una política de invalidación.

Lista acotada de reservas autorizadasC#

Punto de partida db.Reservas es DbSet<ReservaFila>; grupoAutorizado proviene de una identidad comprobada. Con EF Core agrega using Microsoft.EntityFrameworkCore. Es una primera página; para páginas posteriores implementa un cursor.

Antes de ejecutar

Consulta ilustrativa con proveedor relacional

var limite = Math.Clamp(tamanoSolicitado, 1, 50);
var lista = await db.Reservas
    .AsNoTracking()
    .Where(r => r.GrupoId == grupoAutorizado && !r.Cancelada)
    .OrderBy(r => r.Inicio).ThenBy(r => r.Id)
    .Select(r => new { r.Id, r.SalaId, r.Inicio, r.Fin })
    .Take(limite)
    .ToListAsync(ct);

Resultado esperado: Una consulta obtiene como máximo 50 filas con orden determinista y sin campos internos.

04 · Práctica guiada · opcional

Practica lo aprendido

Compara SQL, viajes y filas antes y después de proyectar.

  1. 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
  2. 02Compara SQL, viajes y filas antes y después de proyectar.
  3. 03Comprueba y registra el resultado: Como máximo 50 resultados, dos campos y orden determinista.
Ver solución orientativa

La mejora necesita medición con carga representativa. No concluyas rendimiento por contar líneas de C#.

05

Comprueba lo aprendido

Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.

01¿AsNoTracking corrige una consulta que carga millones de filas?

No. Reduce seguimiento; todavía debes filtrar, proyectar y limitar.

02¿Qué observarías para comprobar una mejora además de reducir líneas de C#?

Compara SQL, filas, viajes y duración con datos y carga representativos. Menos código o ausencia de seguimiento no demuestra menos trabajo del proveedor.

Cómo demostrar el objetivo

Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.

  • La consulta devuelve como máximo 50 filas del grupo y dos campos en orden determinista.
  • La comparación registra SQL, filas y viajes con datos representativos antes de concluir una mejora.

Qué debes recordar

  • Filtra, proyecta y pagina antes de cargar.
  • Una mejora de rendimiento debe medirse.
Tu cuaderno · notas personales

Cuaderno local

Tus notas del contenido

Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.

Guardado local automático
Material de apoyo · descarga, glosario y referencias
Libro de trabajo · Consultas eficientes, paginación y mediciónLaboratorio C# · núcleo y 15 comprobaciones

Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.