2009-09-15 10 views
2

J'ai une base de données simple à partir de laquelle je génère des classes Linq2SQL en utilisant un datacontext. Dans une partie de ma demande, je voudrais charger toute la relation de sorte que je reçois des dossiers d'enfant. Dans une autre partie de l'application je passe cette relation à travers la frontière entre le modèle et la vue et je voudrais ne pas passer le tout car l'ensemble des enfants est assez grand. Y a-t-il un moyen de ne pas exporter ces classes d'enfants dans une section et d'en exporter dans une autre?Non charger la relation entière

Je suis conscient de définir la propriété enfant sur False dans le datacontext, mais il s'agit d'une modification globale.

Répondre

1

Vous pouvez le faire avec le paramètre DataLoadOptions sur le contexte de données. Vous aurez probablement une sorte de classe de construction quelque part dans votre application. Pour la solution la plus rapide et le plus sale, vous pouvez faire quelque chose comme ce qui suit ...

public class SqlContextBuilder 
{ 
    public SqlContextBuilder(MyDataContext dataContext) 
    { 
     _dataContext = dataContext; 
    } 
    private readonly MyDataContext _dataContext; 
    public MyDataContext CreateEagerLoadingContext() 
    { 
     var options = new DataLoadOptions(); 
     // set those options! 
     _dataContext.LoadOptions = options; 
     return _dataContext; 
    } 
    public MyDataContext CreateLazyLoadingContext() 
    { 
     // lazy loading happens by default 
     return _dataContext; 
    } 
} 
+0

Cela n'empêche pas le chargement de données, il le retarde simplement jusqu'à ce qu'il soit demandé. Comme je passe une collection de données à la vue, il est demandé et rempli. – stimms

+0

L'ORM va avoir la liaison (à condition d'utiliser le même DBML). Si vous ne les demandez jamais, les classes enfants ne seront jamais remplies. Par conséquent, vous avez une opportunité de récupération où les classes enfant sont remplies dans la requête initiale et une autre où elles sont chargées paresseusement (ou peut-être jamais chargées du tout). –

0

L'une des solutions est de passer la relation comme IQuerable. Cela s'assurera que la relation n'est pas exécutée jusqu'à ce que cela soit requis. Si vous bouclez la relation, elle sera exécutée pour chaque enfant.

Une autre technique peut être d'utiliser des objets DTO pour créer un ViewModel que vous souhaitez transmettre. Cela signifie que votre ViewModel peut être très similaire à l'interface.

Questions connexes