Io corro in un problema con il seguente: pseudoquerydue simili query LINQ, completamente diverso SQL generato
var daily = from p in db.table1
group p by new
{
key1,
key2
} into g
join d in db.table2
on new { p.key1, p.key2 } equals { d.key1, d.key2 }
select new
{
col1 = g.Key.key1
col2 = g.Sum(a => a.column2)
col3 = d.column3
};
Si corre, ma l'istruzione SQL generata che LINQ invia a SQL Server è assurdo. L'implementazione effettiva segue una configurazione simile a quella precedente con 7 o più colonne che hanno ciascuna un calcolo .Sum(). L'SQL generato ha da qualche parte circa 10-11 istruzioni SELECT nidificate con nessun JOIN INNER e, ovviamente, impiega un'eternità per essere eseguito.
Ho provato un'altra implementazione della query:
var daily = from p in
(from p in db.table1
group p by new
{
key1,
key2
} into g
select new
{
col1 = g.Key.key1,
col2 = g.Sum(a => a.column2)
})
join d in db.table2
on new { p.key1, p.key2 } equals new { d.key1, d.key2 }
select new
{
col1 = p.col1,
col2 = p.col2,
col3 = d.column3
};
Questa versione genera molto più ragionevole SQL con un singolo SUB-SELECT e un INNER JOIN (funziona anche dannatamente vicino all'istante). La cosa che odio di questo è che la prima query LINQ è, IMHO, molto più diretta e concisa mentre la seconda sembra piuttosto ridondante poiché finisco per dover definire tutte le colonne che voglio da table1 due volte.
Perché queste due query simili funzionano in maniera così diversa sul server e perché la query 2 risulta molto più efficiente anche se il codice è molto meno espressivo?
C'è un modo per riscrivere la prima query per essere efficiente come la seconda?
È possibile pubblicare l'SQL di entrambe le versioni? – usr
@usr Certo, provami a ripulirlo un po 'prima come ho fatto per le query LINQ. – Kittoes0124
@Kittoes È possibile utilizzare [** LinqPad **] (http://www.linqpad.net/) per scrivere Linq e ottenere il codice Lambda e SQL – balexandre