2011-01-15 8 views
1

나는 다음과 같은 쿼리가 : DB에서 필요한 팀 ID의Linq2Sql : 쿼리 최적화

  1. 가져 오기 목록 :

     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. 섹터를 기반으로 한 경기장 목록 만들기 :

    여기 6,
    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. 잠재적으로, 나는 (인덱스를 사용하여) 서버에서 아이템을 정렬하고, 팀 아이디를 정렬하고, 콜렉션을 실제로 쿼리하지 않고 섹터 콜렉션을 사용하여 작업 할 수 있습니다.하지만이를 최적화하는 더 좋은 방법은 없을까요?

답변

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()'를 적용하면 다음 오류가 발생합니다. Queryable 메서드 호출이 필요합니다. 'teamSectors.ToList()'를 얻었습니다. 매개 변수 이름 : 정보. 'AsQueryable()'호출 시도가 여기에 설명되어 있습니다 : http://stackoverflow.com/questions/4697982/linq2sql-query-subquery-optimisation – Budda

+0

그래, 일단 개체로 변환되면이 작업을 수행해야합니다. 나는 당신의 다른 질문에 대한 대답을 반영하도록 대답을 업데이트 할 것입니다. – tvanfosson

+0

예, 저는 이쪽으로갔습니다. 이 답변이 실제로 테스트되지는 않았지만 제대로 작동해야하는 것처럼 보입니다. 감사. – Budda