2011-01-15 5 views
1

je la requête suivante:Linq2Sql: optimisation des requêtes

  1. liste Obtenir des ids de l'équipe requis de DB:

     IList<int> teamIds = 
          (from sector in DbContext.sectors 
          where sector.Type=typeValue 
          group sector by sector.TeamId into teamSectors 
          select teamSectors.Key 
          ).ToList(); 
    
  2. En utilisant cette liste chercher tous les secteurs pour les équipes nécessaires:

    IList<InfrStadSector> sectorsForAllTeams = (from sector in DbContext.sectors 
             where teamIds.Contains(sector.TeamId) 
             select sector 
             ).ToList(); 
    
  3. Créer une liste de Stades selon les secteurs:

    IList<InftStadium> stadiums = new List<InfrStadium>(); 
    foreach(int teamId in teamIds) 
    { 
        IList<InfrStadSector> teamSectors = 
         sectorsForAllTeams.Where(sect=>sect.TeamId==teamIds).ToList(); 
        stadiums.Add(new InfrStadium(teamId, teamSectors); 
    } 
    

Ce qui me préoccupe est que la collecte a reçu de DB je dois demander Où/ToList sur le côté client une fois par chaque équipe

Est-il possible d'optimiser cela?

Merci.

P.S. Potentiellement, je pourrais trier les éléments sur le serveur (en utilisant l'index), puis trier les teamIds et travailler avec la collection des secteurs sans vraiment «interroger» la collection ... mais il y a probablement une meilleure façon d'optimiser cela?

Répondre

1

Je pense que vous pouvez le faire en une seule étape.

var stadiums = DbContext.sectors 
         .Where(s => s.Type == typeValue) 
         .ToLookup(s => s.TeamId) 
         .Select(l => new InfrStadium(l.Key, l.ToList()) 
         .ToList(); 

Bien, ce serait mieux si vous pourriez avoir le constructeur pour InfrStadium prendre un IEnumerable<Sector> plutôt que d'exiger une List<Sector>, vous pouvez alors omettre le ToList supplémentaire.

+0

Si j'applique 'ToList()' à teamSectors, l'erreur suivante s'affiche: Appel de méthode interrogeable attendu. Vous avez 'teamSectors.ToList()'. Nom du paramètre: info. Tenter d'appeler 'AsQueryable()' est décrit ici: http://stackoverflow.com/questions/4697982/linq2sql-query-subquery-optimisation – Budda

+0

Oui, vous avez probablement besoin de faire cela une fois qu'ils sont convertis en objets. Je mettrai à jour la réponse pour refléter celle que j'ai donnée pour votre autre question. – tvanfosson

+0

Oui, je suis allé par ici. Bien que cette réponse n'ait pas été réellement testée, il semble que cela devrait fonctionner. Merci. – Budda