Tuve una consulta LINQ que carga una jerarquía de objetos como la siguiente.EF Donde (x => x.ColumnVal == 1) vs FirstOrDefault (x => x.Column == 1)
consulta # 1
var result = db.Orders
.Include("Customer")
// many other .Include() here
.FirstOrDefault(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId);
que estaba teniendo problema de rendimiento MAYOR con él.
El uso de la CPU fue cercano al 100% y el uso de memoria fue muy alto.
Y lo pellizqué a lo siguiente y se solucionó el problema de rendimiento.
consulta # 2
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.FirstOrDefault();
sólo quiero confirmar mi sospecha.
consulta # 1 es, probablemente, un bucle a través de todos mis registros en la memoria en busca de un registro coincidente
vs
consulta # 2 filtra los registros en la base de datos y luego conseguir el primer registro solamente.
¿Por eso la consulta # 1 tiene problemas de rendimiento?
Sólo para estar seguro, necesito para utilizar el .Select(x => x)
antes de la .FirstOrDefault()
?
consulta # 3
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.Select(x => x)
.FirstOrDefault();
Estoy de acuerdo con sus ideas iniciales. Observa las consultas generadas y deja tu mente de lado :-) –