2010-08-02 3 views
14

Ich habe einen Dokumentgenerator, der Abfragen für etwa 200 Elemente im Moment enthält, wird aber wahrscheinlich mehr als 500, wenn abgeschlossen. Ich habe kürzlich festgestellt, dass einige der Mappings Lazy Loading anzeigen. Dies stellt ein Problem für den Dokumentgenerator dar, da er Zugriff auf alle diese Eigenschaften benötigt, basierend darauf, welches Dokument erzeugt wird.Deaktivieren Sie alle Lazy Loading oder zwingen Sie eifrig Laden für einen LINQ-Kontext

Während ich die DataLoadOptions kenne, die für den Kontext angegeben werden kann, würde dies dazu führen, dass ich jede Spalte explizit angeben muss, die möglicherweise geladen werden könnte. Das ist nördlich von 1000, da das gesamte Datenholen in einem Kontext stattfindet.

Gibt es eine Möglichkeit für mich, das Lazy-Laden für einen Kontext zu deaktivieren oder explizit das Eager-Laden zu aktivieren, um die Defer-Ladeeigenschaft zu ignorieren? Vielleicht die DB-Kontextklasse erweitern und etwas außer Kraft setzen?

+0

Endgültige Lösung: http://gist.github.com/506573 –

Antwort

6

Sie müssen DeferredLoadingEnabled, setzen und schließen dann jede Eigenschaft eine Reflexion mit wie:

DataLoadOptions dataLoadOptions = new DataLoadOptions(); 

foreach (PropertyInfo pi in typeof(SomeThingyClass).GetProperties()) 
{ 
    ParameterExpression paramExp = Expression.Parameter(typeof(SomeThingyClass), "s"); 
    Expression expr = Expression.Convert(Expression.Property(paramExp, pi.Name), typeof(object)); 
    LambdaExpression lambda = Expression.Lambda(expr, paramExp); 
    dataLoadOptions.LoadWith((Expression<Func<SomeThingyClass, object>>) lambda); 
} 
+1

BTW, was ist DefredLoadingEnabled in EF-Begriffen? Ist es das gleiche wie context.ContextOptions.LazyLoadingEnabled = true? – Martin

+0

Die Eigenschaften sind alle in verschiedenen Tabellen. Wenn ich diese auch mit der Methode 'GetProperties()' des Kontexts iteriere, wie kann ich nur die 'System.Data.Linq.Table' herausfiltern? –

+0

Am einfachsten wird überprüft, ob 'pi.PropertyType.Name ==" Table'1 "' –

0

Diese mit LINQ to SQL heikel ist. Die kurze Antwort ist, es kommt darauf an.

Wenn Ihre Einheiten sind in einer Weise ausgelegt, dass Sie eine Beziehung haben, die diesen Spiegel: benötigen

Customers -> Orders -> OrderDetails

Und Sie Eigenschaften auf allen 3 Einheiten zu bewerten, um eine Entscheidung zu treffen, Ihr Die beste Wette ist, mit dem Schreiben einer Verbindung zu gehen. Wenn Sie .LoadWith verwenden, werden Customers und Orders mit einer einzigen Anweisung abgerufen, aber dann wird auch eine Abfrage für jeden einzelnen OrderDetails-Datensatz ausgegeben.

Also, auch wenn Sie jede untergeordnete Beziehung mit LoadWith angegeben haben, erhalten Sie keine einzige Abfrage, um das Ergebnis abzurufen.

+0

Alle Eigenschaften sind nur auf dem Objekt ausgewählt werden. Keine Beziehungen werden nach der Tat folgen. –