2010-08-02 2 views
14

J'ai un générateur de document qui contient des requêtes pour environ 200 articles pour le moment mais sera probablement plus de 500 quand complet. J'ai récemment remarqué que certains des mappings dénotent un chargement paresseux. Cela pose un problème pour le générateur de document car il a besoin d'accéder à toutes ces propriétés en fonction du document généré. Bien que je sois conscient du DataLoadOptions qui peut être spécifié au contexte, cela me demanderait de spécifier explicitement chaque colonne qui pourrait éventuellement être chargée. C'est au nord de 1000 car tout le chargement de données a lieu dans un contexte.Désactiver tout chargement paresseux ou forcer le chargement ardent pour un contexte LINQ

Est-ce qu'il y a un moyen pour moi de désactiver le chargement paresseux pour un contexte ou d'autoriser explicitement le chargement hâtif à ignorer la propriété de chargement différé? Peut-être étendre la classe de contexte DB et remplacer quelque chose?

+0

Solution finale: http://gist.github.com/506573 –

Répondre

6

Vous devez définir DeferredLoadingEnabled, puis comprennent tous les biens en utilisant une réflexion comme:

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, qu'est-ce que DeferredLoadingEnabled en termes EF? Est-ce la même chose que context.ContextOptions.LazyLoadingEnabled = true? – Martin

+0

Les propriétés sont toutes dans des tables différentes. Si je les itére aussi en utilisant la méthode 'GetProperties()' du contexte, comment puis-je filtrer uniquement les 'System.Data.Linq.Table'? –

+0

Le plus simple est de vérifier si 'pi.PropertyType.Name ==" Table'1 "' –

0

C'est délicat avec LINQ to SQL. La réponse courte est, cela dépend.

Si vos entités sont disposées de manière à ce que vous avez une relation qui reflète ceci:

Customers -> Orders -> OrderDetails

Et vous devez évaluer les propriétés sur les 3 entités afin de prendre une décision, votre le meilleur pari est d'aller avec l'écriture d'une jointure. L'utilisation de .LoadWith va chercher Customers et Orders en utilisant une instruction unique, mais émettra également une requête pour chaque enregistrement OrderDetails. Donc, même si vous avez spécifié chaque relation enfant avec LoadWith, vous n'obtiendrez pas une seule requête pour récupérer le résultat.

+0

Toutes les propriétés sont uniquement sur l'objet sélectionné. Aucune relation ne sera suivie après le fait. –

Questions connexes