Ho qualcosa di simile nel mio controller C # MVC:
from table1 in db.Table1.AsQueryable()
join table2 in db.Table2.AsQueryable() on table1.Col1 equals table2.Col1
join table3 in db.table3.AsQueryable() on new { table2.Col2, table2.Col5 } equals new { table3.Col2, table3.Col5 }
.
.
few more joins
.
.
WHERE ......
select new {table1.Prop1, table2.Prop2, table3.Prop3}
Quando guardo cosa viene eseguito su SQL Profiler, mi aspettavo una singola query con tutti i join. Invece, seleziona tutte le colonne da tutte le tabelle in query separate. cioè corse
SELECT * FROM Table2 --Instead of * it has all column names
quando ha finito, corre
SELECT * FROM Table3 --Instead of * it has all column names
e così via per ogni tavolo. Le tabelle sono grandi, quindi ci vuole troppo tempo, usando molta memoria. Ho aggiunto AsQueryable()
sulle entità ma non ha fatto alcuna differenza, ancora più query. db
è un DbContext
, utilizzando l'anima 2.
Come posso modificare il LINQ o altre impostazioni in modo che tutto funzioni come una singola query?
Aggiornare
Sembra che il problema sia stato causato dall'avere Convert.ToInt32(
su una delle colonne di join. La colonna int
cui stavo partecipando è nullable in una tabella e non annullabile nell'altra tabella, avevo Convert.ToInt32(
sul nullable tabella, rimuovendo la conversione generata una singola query.
Secondo i documenti LINQ2SQL:
Quando si esegue una query per un oggetto, si recupera in realtà solo l'oggetto richiesto. Gli oggetti correlati non vengono recuperati automaticamente allo stesso tempo.
La classe DataLoadOptions fornisce due metodi per ottenere il caricamento immediato dei dati correlati specificati. Il metodo LoadWith consente il caricamento immediato dei dati relativi all'obiettivo principale. Il metodo AssociateWith consente di filtrare gli oggetti correlati.
Questo è un problema con Lazy Loading vs Eager Loading.
Questo è un ottimo post con una spiegazione molto buona.