2009-03-13 13 views
12

Ich möchte die Daten mit Eager-Laden mit Linq2SQL zu holen. Der Code ist ähnlich wie:Linq2SQl Eager laden mit mehreren DataLoadOptions

 DataLoadOptions options = new DataLoadOptions(); 

     options.LoadWith<Product>(c => c.ProductCompanies); 

     options.LoadWith<Product>(c => c.OrderDetails); 

     db.LoadOptions = options; 

     IEnumerable<Product> products = db.Products.ToList<Product>(); 

Ich überprüfe es generiert mehr als 1 SQL-Abfrage, wie ich erwartet habe. Tatsächlich wird nur mit den Product and OrderDetails geladen, und die ProductCompany wird nacheinander abgefragt. Habe ich hier etwas falsch gemacht? Oder ist es ein Linq2SQL-Problem? Haben wir einen Workaround?

Vielen Dank!

Update: Ich überprüfe die SQL von SQL Profiler. Ich fand, dass sowohl Leppie als auch Ian korrekt sind. Sie sind in einer Transaktion gebunden. Aber wenn ich es als Lazy Load eingestellt habe, hat es mehrere Verbindungen geöffnet.

+1

Seien sie vorsichtig DataLoadOptions erstellt einige sehr ineffiziente Abfragen. –

+0

Danke, Tschad! Ich werde in meinem nächsten Projekt nach Nhibernate zurückkehren: =) –

Antwort

3

Nein, Sie haben nichts falsch gemacht, Linq2SQL stapelt alles in einer einzigen Transaktion, kann aber eine unbegrenzte Anzahl von Abfragen für das gewünschte Ergebnis ausführen. DataLoadOptions wird normalerweise nur verwendet, wenn DataContext nicht für den gesamten Kontext der resultierenden Verwendung verfügbar ist. Wenn Sie die DataContext während der Ausführung am Leben erhalten können, ist es am besten, sich auf die verzögerte Ausführung zu verlassen (das ist die Standardeinstellung).

+0

Danke, leppie! Ich überprüfe SQL-Profil, die sqls sind in einer Transaktion. –

2

die Dokumentation nach:

Wenn Sie für ein Objekt abzufragen, rufen Sie eigentlich nur das Objekt, das Sie angefordert. Die zugehörigen Objekte werden nicht automatisch zur selben Zeit abgerufen.

Die DataLoadOptions-Klasse bietet zwei Methoden zum sofortigen Laden der angegebenen verwandten Daten. Die LoadWith-Methode ermöglicht das sofortige Laden von Daten im Zusammenhang mit dem Hauptziel. Die AssociateWith-Methode ermöglicht das Filtern verwandter Objekte.

Mit mehreren SQL-Anweisungen überrascht mich nicht. Ich denke der Unterschied hier ist, dass alle Aussagen nur vorne geladen werden, anstatt sie auf Abruf zu laden.

+0

Danke, Ian! Ich glaube, Du hast recht. –

+2

Die überraschende Sache ist 'LoadWith ' * garantiert nicht das eifrig-Laden: -/ –

16

Ich habe dieses Problem in einigen Code auch, und nach viel experimentieren und googeln sieht es aus wie LINQ kann nur über eine einzige Eins-zu-viele-Beziehung aus jeder Tabelle beitreten: wenn Sie versuchen, mehr als eine zu spezifizieren laden sie es einfach (zufällig?) nimmt die man Vorbelastung und die andere verschoben zu verlassen (nur jene Loadwith Hinweise zu ignorieren)

Andere Leute diese auch gebucht haben, zum Beispiel

http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx

+2

Netter Link. Und noch besser, diese Antwort beantwortet tatsächlich die Frage - * "WARUM IST DIE DOKUMENTATION FALSCH UND/ODER FEHLERHAFT" *? 'LoadWith ' kann sehr einfach * unbemerkt * oder * eine eigene Sache * ausführen und beim Zugriff auf Objekte außerhalb einer DataContext-Lebensdauer Probleme verursachen. Ich interessiere mich nicht einmal für Effizienz - ich will nur Semantik arbeiten. Der einzige zuverlässige Weg, den ich gefunden habe, um dies effektiv zu handhaben, ist der manuelle * Erzwingung * Zugriff innerhalb des DataContext Bereichs. –

Verwandte Themen