强制LINQ to SQL对所有子行进行一次调用

时间:2010-05-24 11:31:36

标签: linq-to-sql

假设我有一个方法(例子来自另一篇文章):

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 个答案:

答案 0 :(得分:1)

Linq to SQL的急切负载是有缺陷的,它是一个前期执行的延迟加载.. 也就是说,每个实体每个集合一个查询。 因此,您可以获得与延迟加载相同的纹波负载效果,但是您可以预先获得它们。

实体框架4支持真正的预先加载,它可以发出一个返回所有结果的查询。

答案 1 :(得分:1)

答案 2 :(得分:0)

您是否熟悉延迟加载和预先加载的L2S概念?延迟加载可以满足您的需求。每次请求子记录时,它都将转到数据库。急切的装载让他们全部都在前面。您可以通过Google搜索Linq和Lazy或Eager Loading来了解有关此内容的更多信息。

答案 3 :(得分:0)

也许你可以使用Join和Group By?

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