2010-04-21 4 views
0

Mon programme a la définition de classe suivante:Comment créer un constructeur d'une classe qui retourne une collection d'instances de cette classe?

public sealed class Subscriber 
{ 
    private subscription; 
    public Subscriber(int id) 
    { 
     using (DataContext dc = new DataContext()) 
     { 
      this.subscription = dc._GetSubscription(id).SingleOrDefault();     
     }    
    } 
} 

, où

_GetSubscription() est un sproc qui retourne une valeur de type ISingleResult<_GetSubscriptionResult>

Say, j'ai une liste de type List<int> plein de 1000 id s et je veux créer une collection d'abonnés de type List<Subscriber>.

Comment est-ce que je peux faire cela sans appeler le constructeur dans une boucle pendant 1000 fois?

Depuis que j'essaie d'éviter de basculer le DataContext on/off si fréquemment que cela peut stresser la base de données.

TIA.

+0

D'où viennent les 1000 ID? Pouvez-vous modifier la base de données afin qu'elle utilise une fonction au lieu d'un sproc? – SteadyEddi

+0

Merci pour votre commentaire ... Pas vraiment par choix, je suis juste en train de coder dans la façon d'utiliser ce drôle de sproc comme on me l'a dit, mon nom d'utilisateur donnant quelques indications sur mon pouvoir d'influence aux autres : -) – Chris

+0

Correction du code, voir ma réponse. –

Répondre

6

Écrivez une méthode d'usine statique qui appelle un constructeur privé.

public sealed class Subscriber 
{ 
    // other constructors ... 

    // this constructor is not visible from outside. 
    private Subscriber(DataContext dc, int id) 
    { 
     // this line should probably be in another method for reusability. 
     this.subscription = dc._GetSubscription(id).SingleOrDefault();     
    } 

    public List<Subscriber> CreateSubscribers(IEnumerable<int> ids) 
    { 
     using (DataContext dc = new DataContext()) 
     { 

      return ids 
      .Select(x => new Subscriber(dc, x)) 
      // create a list to force execution of above constructor 
      // while in the using block. 
      .ToList(); 
     }    

    } 

} 
+0

Salut Stefan, Votre réponse est vraiment cool. Cependant, j'ai reçu une exception System.ObjectDisposedException lorsque DataContext est supprimé. System.ObjectDisposedException was unhandled Message = "Impossible d'accéder à un objet éliminé. \ R \ nNom d'objet: 'DataContext accessible après Dispose.'" Source = "System.Data.Linq" ObjectName = "DataContext accessible après Dispose." Merci – Chris

+0

J'ai essayé d'enregistrer une copie locale de la valeur de retour, mais cela ne fonctionne toujours pas. – Chris

+0

J'ai réussi à le faire fonctionner en faisant quelque chose comme ... retourner ids.select (x => nouvel abonné (dc, x)). ToList(); Mais je suis confus ce qui se passe ici. Une chose dont je suis sûr est que la durée de vie de IEnumerable est liée au DataContext. – Chris

Questions connexes