2010-09-23 2 views
0

J'ai une procédure stockée spéciale qui renvoie une liste de distributeurs de ma base de données. Je parcours ensuite la boucle des distributeurs et affiche les résultats sur une page Web. Cependant, j'ai besoin de charger l'état et le pays pour chaque distributeur. Je préférerais faire ceci une fois, avant la boucle pour que la page soit plus rapide. Ceci est mon code:Eager Chargement des enfants pour un appel de procédure stockée LINQ

List<Distributor> distQuery = connection.spDistFindLocal(Lat, Long).ToList<Distributor>(); 

Je sais que je peux faire distributor.State.Load(); sur chaque élément dans ma liste, mais je pense que c'est un mauvais choix. Quelles autres options ai-je?

Répondre

1

Utilisez une projection:

List<DistributorViewModel> distQuery = 
    (from d in connection.spDistFindLocal(Lat, Long) 
    select new DistributorViewModel 
    { 
     Name = d.Name, 
     State = d.State.Name, 
     Country = d.Country.Name 
    })ToList(); 

Non seulement cette charge toutes les données dans une requête, mais il omet également de charger les propriétés que vous ne se soucient pas de ce point de vue.

+0

@Craig - Génial Je ne pensais même pas au problème de cette façon! Une question, je devrais déclarer ce qui est dans DistributorViewModel droit? Si oui, où ferais-je cela? Y a-t-il un article quelque part qui le couvre? C'est un nouveau territoire pour moi. Merci! –

+0

Vous pouvez déclarer un nouveau type n'importe où dans la portée ou vous pouvez utiliser un type anonyme dans certains cas. [J'ai écrit un article à ce sujet sur mon blog] (http://blogs.teamb.com/craigstuntz/2009/12/31/38500/) –

+0

@Craig - Il m'a donc fallu du temps pour y revenir mais fonctionne totalement! J'adore ça merci pour l'aide. Une chose sur votre blog est que vous avez [Key, ScaffoldColumn (false)]. Comment/À quoi cela sert-il? J'ai créé ma classe de présentation à l'intérieur de ma page car je ne l'ai utilisée qu'une seule fois. Quand j'ai essayé d'ajouter ce code VS2010 ne l'a pas reconnu du tout. J'ai mis à niveau vers .Net 4 donc je ne sais pas si cela fait une différence. –

Questions connexes