Linq2Sql: оптимизация запросов - PullRequest
1 голос
/ 15 января 2011

У меня следующий запрос:

  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. Создать список стадионов по секторам:

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

Меня беспокоит то, что для сбора, полученного из БД, мне нужно применить Where / ToList на стороне клиента один раз для каждой команды

Есть ли способ оптимизировать это?

Спасибо.

P.S. Потенциально, я мог бы сортировать элементы на сервере (с помощью индекса), затем сортировать teamIds и работать с коллекцией секторов без необходимости «запрашивать» коллекцию ... но, возможно, есть лучший способ оптимизировать это?

1 Ответ

1 голос
/ 15 января 2011

Я думаю, вы можете сделать это за один шаг.

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

Хотя было бы лучше, если бы вы могли иметь конструктор для InfrStadium вместо IEnumerable<Sector> вместо List<Sector>, тогда вы могли бы опустить дополнительные ToList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...