Ich projiziere LINQ zu SQL-Ergebnissen zu stark typisierten Klassen: Parent und Child. Der Performance-Unterschied zwischen diesen beiden Abfragen ist groß:Eins-zu-viele projizierte LINQ-Abfrage wird wiederholt ausgeführt
langsame Anfragen - von der Datacontext-Anmeldung zeigt, dass ein separater Aufruf die db wird
für jeden Elternteil gemacht wirdvar q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
Schnelle Abfrage - Protokollierung von der Datacontext zeigt eine einzige db Hit-Abfrage, die alle erforderlichen Daten
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
ich möchte zwingen, LINQ gibt die Single-Abfrage Stil des zweiten Beispiels zu verwenden, aber die Eltern-Klassen mit ihren Kinder-Objekte direkt zu füllen. Andernfalls ist die Children-Eigenschaft eine IQuerierable<Child>
, die abgefragt werden muss, um das Child-Objekt verfügbar zu machen.
Die referenzierten Fragen scheinen nicht meine Situation zu adressieren. Die Verwendung von db.LoadOptions funktioniert nicht. vielleicht muss der Typ eine TEntity sein, die beim DataContext registriert ist.
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
Bitte beachten Sie: Eltern und Kind sind einfache Typen, nicht Table<TEntity>
Typen. und es gibt keine kontextuelle Beziehung zwischen Eltern und Kind. Die Unterabfragen sind Ad-hoc. Die Crux des Problems: Im 2. LINQ-Beispiel implementiere ich IQueriable
Anweisungen und rufe nicht ToList()
Funktion auf und aus irgendeinem Grund weiß LINQ, wie man eine einzelne Abfrage generiert, die alle erforderlichen Daten abrufen kann. Wie befülle ich meine Ad-hoc-Projektion mit den tatsächlichen Daten, wie sie in der ersten Abfrage durchgeführt werden? Auch wenn mir jemand helfen könnte, meine Frage besser zu formulieren, würde ich es begrüßen.
Wie kann 'Child' ein" einfacher Typ "sein? Es sollte ein abgebildeter Typ sein. Und ist "Elterntabelle" eine "Tabelle" oder das Ergebnis einer vorherigen Linq-Abfrage? Einige linq-Anweisungen können dazu führen, dass L2S von der Verknüpfung zu N + 1 wechselt. –
Doppelte Marker: Kennen Sie den Unterschied zwischen Entity Framework und Linq zu SQL? –
@GertArnold Während der LINQ-Teil von EF/L2S häufig ähnliche Fragen funktional dupliziert, glaube ich, dass Sie in diesem Fall völlig korrekt sind. Sie sind keine Duplikate. Wiedereröffnung. –