Принуждение LINQ к SQL, чтобы сделать один единственный вызов для всех дочерних строк - PullRequest
2 голосов
/ 24 мая 2010

Допустим, у меня есть метод (пример взят из другого поста):

public IQueryable<CityBlock> GetCityBlocks(){
    var results = from o in db.city_blocks
                  let buildings = GetBuildingsOnBlock(o.block_id) //returns Iqueryable
                  select new CityBlock {
                      BuildingsOnBlock = buildings,
                      BlockOwner = o.block_owner
                  };
    return results;
}

В вызывающем методе я добавляю методы Skip () и Take () плюс некоторую фильтрацию, а затем делаю ToList ().

Проблема в том, что я получаю десятки вызовов базы данных - один для всех городских кварталов, а затем отдельный для каждого здания.

Есть ли способ, которым я могу реорганизовать этот код, чтобы просто сделать два вызова: один для городских кварталов и один для всех зданий

Следует добавить, что я пробовал загружать с помощью:

var dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<city_blocks>(x => x.buildings);            
db.LoadOptions = dataLoadOptions;

но, похоже, не имеет значения.

Ответы [ 4 ]

1 голос
/ 24 мая 2010
1 голос
/ 24 мая 2010

Стремительная загрузка в Linq to SQL некорректна, это ленивая нагрузка, выполняемая заранее, то есть один запрос на коллекцию для каждой сущности.Таким образом, вы получаете те же эффекты пульсации нагрузки, что и ленивую загрузку, но вы получаете их заранее.

Entity Framework 4 поддерживает истинную активную загрузку, он может выполнить один запрос, который возвращает все результаты.

0 голосов
/ 24 мая 2010

Возможно, вы могли бы использовать объединение и группирование по?

public IQueryable<CityBlock> GetCityBlocks(){
    var results = from o in db.city_blocks
                  join b in db.buildings on o.block_id equals b.block_id
                  group by o into g
                  select new CityBlock {
                      BuildingsOnBlock = g.buildings.DefaultIfEmpty(),
                      BlockOwner = g.Key.block_owner
                  };
    return results;
}
0 голосов
/ 24 мая 2010

Вам знакомы концепции L2S Lazy Loading и Eager Loading?Ленивая загрузка делает то, что вы испытываете.Он будет попадать в базу данных каждый раз, когда будет сделан запрос на дочерние записи.Готовая загрузка получает их всех сразу.Вы можете выполнить поиск в Google по Linq и Lazy или Eager Loading, чтобы узнать больше об этом.

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