Hey devs, toca tema cortito y al grano.
En Entity Framework Core hay dos métodos que suelen confundirse para obtener un solo registro:
FindAsync y FirstOrDefaultAsync. Aunque parecen equivalentes, no lo son.
Vamos a lo práctico.
FindAsync: para búsquedas por clave primaria
var user = await context.Users.FindAsync(id);
¿Qué hace realmente?
- Busca primero en el Change Tracker
- Si no está en memoria, va a la base de datos
- Usa solo la clave primaria
Ventajas:
- Más rápido en escenarios comunes
- Evita queries innecesarias
- Ideal para CRUD clásicos
Limitaciones:
No todo es color de rosa, tiene las siguientes desventajas:
- Solo funciona con Primary Key
- No permite filtros adicionales
- No puedes usar
Include
Úsalo cuando estás buscando una entidad por su ID y nada más.
FirstOrDefaultAsync: para queries flexibles
var user = await context.Users.FirstOrDefaultAsync(u => u.Email == email);
¿Qué hace?
- Siempre ejecuta una query SQL
- Permite filtros complejos
- Soporta
Include,OrderBy, etc.
Ventajas:
- Muy flexible
- Ideal para búsquedas por campos no PK
Desventajas:
- Siempre va a la base de datos
- Puede ser más costoso si abusas de él
Error común (...y muy frecuente)
// No hagas esto
var user = await context.Users.FirstOrDefaultAsync(u => u.Id == id);
//Haz esto
var user = await context.Users.FindAsync(id);
Entonces ya lo sabes dev...
La regla de oro es que si quieres obtener algo por su Id o primary key, utiliza FindAsync. Por otro lado, si quieres traer uno o más registros por cualquier otro criterio, usa FirstOrDefaultAsync.
No es que uno sea mejor que el otro, cada método tiene su contexto correcto.
Si usas FirstOrDefaultAsync para todo, tu código funciona… pero tu base de datos paga el precio.
Ya sabes, estimado dev, si te ha encantado este artículo, compártelo! 🐿️🎉
Créditos imagen de portada: Foto de Ashe Walker en Unsplash
