La seguente chiamata linq in semplice linq a sql genera 1 query SQL nel database
Table1.Select(t => new {Table2.First().Property1})
Ma non riesco a portare Dynamic Linq allo stesso modo, il seguito produce 2 query separate.
Table1.Select("new(@0.Property1)", Table2.First())
Neanche questo funziona
Table1.Select("@0", Table2.First().Property1)
o questo
Table1.Select("new(@0 as MyField)", Table2.First().Property1)
Cosa mi sto perdendo?
Grazie alle intuizioni di Jeff, la corretta disposizione delle query dovrebbe essere
Table1.Select(t => new {t2 = Table2.First()}).Select("new(t2.Property1)")
che produce una singola chiamata di query al DB
Sta generando due query separate perché in quel contesto, Table2.First()
è una chiamata separata dal resto della query. Non è integrato nell'espressione generata. È come se avessi fatto questo:
var first = Table2.First(); // evaluated eagerly due to the First() call
var query = Table1.Select("new(@0.Property1)", first);
Puoi ottenere il risultato desiderato se lo riscrivi in termini di prodotto cartesiano con la seconda tabella.
var query = Table1.SelectMany(t1 =>
Table2.Take(1).Select(t2 => new { t1, t2 })
)
.Select("new(t2.Property1 as MyField)");