2016-05-22 25 views
0

Die folgende Linq Aufruf im Klar LINQ to SQL-Ergebnisse in 1 SQL-Abfrage an die DatenbankDynamische Linq mehrere Abfragen

Table1.Select(t => new {Table2.First().Property1}) 

Aber ich Dynamische Linq zu bekommen, um auf das gleiche schafft kann nicht scheinen, die unten erzeugt 2 getrennte Abfragen

Table1.Select("new(@0.Property1)", Table2.First()) 

Dies gilt entweder

Table1.Select("@0", Table2.First().Property1) 

oder nicht funktionieren

Table1.Select("new(@0 as MyField)", Table2.First().Property1) 

Was bin ich?

Antwort

0

Dank Einsichten Jeffs die richtige Abfrage Anordnung sollte

sein
Table1.Select(t => new {t2 = Table2.First()}).Select("new(t2.Property1)") 

, die eine einzige Abfrage Aufruf der DB erzeugt

0

Es generiert zwei separate Abfragen, da in diesem Kontext Table2.First() ein separater Aufruf vom Rest der Abfrage ist. Es ist nicht in den generierten Ausdruck integriert. Es ist, als ob du das getan hast:

var first = Table2.First(); // evaluated eagerly due to the First() call 
var query = Table1.Select("new(@0.Property1)", first); 

Sie können das gewünschte Ergebnis erzielen, wenn Sie es im Hinblick auf ein kartesisches Produkt mit der zweiten Tabelle neu geschrieben.

var query = Table1.SelectMany(t1 => 
     Table2.Take(1).Select(t2 => new { t1, t2 }) 
    ) 
    .Select("new(t2.Property1 as MyField)"); 
+0

ich einen Fehler „, keine Eigenschaft oder ein Feld t2 auf IQueryable vorhanden '1" – OrdinaryOrange

+0

Tut mir leid, da sollte ein 'It' stehen. –

+0

Sollte das nicht benötigen, da der Kontext bereits implizit ist. So oder so funktionierte das immer noch nicht. Grund dafür war, dass die Abfrage ein IOrderedQueryable > zurückgab, also kein Wunder, dass es die Eigenschaft t2 nicht finden konnte. Gefunden die richtige Abfrage wie unten angegeben. – OrdinaryOrange