2011-01-15 11 views
1

は、私は次のクエリを持っている:DBから必要なチームIDのLinq2Sql:クエリの最適化

  1. のGetリスト:

     IList<int> teamIds = 
          (from sector in DbContext.sectors 
          where sector.Type=typeValue 
          group sector by sector.TeamId into teamSectors 
          select teamSectors.Key 
          ).ToList(); 
    
  2. このリストを使用するには、必要なチームのすべてのセクターをフェッチ

    IList<InfrStadSector> sectorsForAllTeams = (from sector in DbContext.sectors 
             where teamIds.Contains(sector.TeamId) 
             select sector 
             ).ToList(); 
    
  3. セクターに基づいてスタジアムのリストを作成します。

    ここ
    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); 
    } 
    

私の関心は、コレクションのためのDBから受信したということです私は、クライアント側でどこ/ ToListメソッドを適用する必要があり、一度、各チーム

あたりのことを最適化する方法はありますか?

ありがとうございました。

P.S.潜在的に、私はサーバー上のアイテムを並べ替えることができました(インデックスを使用して)、チームアイランドを並べ替えて、実際にコレクションにクエリを出すことなくセクタコレクションで作業することができました...しかし、おそらくそれを最適化する良い方法がありますか?

答えて

1

私はこれを1ステップで行うことができると思います。

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

InfrStadiumList<Sector>を必要とするのではなく、IEnumerable<Sector>を取るためにあなたはコンストラクタを持っていることができれば、それは良いだろう、が、その後、あなたは余分なToList省略することができます。

+0

TeamSectorsに 'ToList()'を適用すると、次のエラーが発生します。クエリ可能なメソッド呼び出しが必要です。 'teamSectors.ToList()'を取得しました。パラメータ名:infoここでは 'AsQueryable()'を呼び出す試みが記述されています:http://stackoverflow.com/questions/4697982/linq2sql-query-subquery-optimisation – Budda

+0

ええ、オブジェクトに変換されたら、これを行う必要があります。私はあなたの他の質問に私が与えたものを反映するために答えを更新します。 – tvanfosson

+0

はい、私はこのように行った。この回答は実際にはテストされていませんが、うまくいくようです。ありがとう。 – Budda