Ho una query da linq a sql che restituisce alcuni ordini con saldo diverso da zero (in effetti, la query è un po 'complicata, ma per semplicità ho omesso alcuni dettagli). Anche questa query dovrebbe restituire gli ordini senza CardItems (entrambe le sottoquery restituiscono NULL in T-SQL e il confronto tra due NULLS dà FALSE, quindi converto i valori NULL dei risultati delle sottoquery a 0 per il confronto).Invia Linq a Sql genera T-SQL con ISNULL invece di 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);
Il problema è, che la conversione espressione Sum (i => (doppia?) I.Amount) ?? 0 produce l'operatore COALESCE, che è dieci volte più lento della stessa query T-SQL con COALESCE sostituito a ISNULL a causa della sottoquery in esso. C'è qualche possibilità di generare ISNULL in questa situazione?
come una questione tecnica questo ha un sacco di meriti. Tuttavia, come programmatore devo chiedere: questo tipo di micro-ottimizzazione sembra sbagliato, è importante? –
@PreetSangha, cosa c'è di "sbagliato" nello scrivere un codice nel modo giusto se sai dov'è il problema? Considero un approccio sbagliato, quando anche se conosci il problema, non fai nulla al riguardo ... Se produci volentieri un codice che è 10 volte più lento di quanto potrebbe essere, è piuttosto interessante chiamare l'ottimizzazione " sbagliato "... – walther
Penso che ?? Parte 0 sta per la coalesce – V4Vendetta