Tengo una consulta de linq a sql que devuelve algunas órdenes con saldo distinto a cero (de hecho, la consulta es un poco complicada, pero por simplicidad omití algunos detalles) Esta consulta también debe devolver pedidos sin CardItems (ambas sub-consultas devuelven NULL en T-SQL, y la comparación de dos NULLS da FALSE, por lo que convierto los valores de resultado NULL de las sub-consultas a 0 para comparar).Make Linq to Sql genera T-SQL con ISNULL en lugar de COALESCE
var q = (from o in db.Orders
where db.Cards(p =>
p.OrderId == o.Id
&& p.Sum + (db.CardItems.Where(i => i.IncomeId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
!= (db.CardItems.Where(i => i.DeductId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
).Any()
select o);
El problema es, que la conversión de expresión suma (i => (doble?) I.Amount) ?? 0 produce el operador COALESCE, que es diez veces más lento que exactamente la misma consulta T-SQL con COALESCE reemplazado a ISNULL debido a una subconsulta en él. ¿Hay alguna posibilidad de generar ISNULL en esta situación?
Como una cuestión técnica que esto tiene un montón de mérito. Sin embargo, como programador tengo que preguntar: este tipo de micro-optimización parece equivocado, ¿es importante? –
@PreetSangha, ¿qué hay de malo en escribir un código de la manera correcta si sabes cuál es el problema? Considero que es un enfoque equivocado, cuando sabes sobre el problema, no haces nada al respecto ... Si obtienes voluntariamente un código que es 10 veces más lento de lo que podría ser, es bastante interesante llamar a la optimización ". mal "... – walther
Creo que ?? La parte 0' resulta del coalesce – V4Vendetta