假设我有一个方法(例子来自另一篇文章):
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;
但似乎没有什么区别。
答案 0 :(得分:1)
Linq to SQL的急切负载是有缺陷的,它是一个前期执行的延迟加载.. 也就是说,每个实体每个集合一个查询。 因此,您可以获得与延迟加载相同的纹波负载效果,但是您可以预先获得它们。
实体框架4支持真正的预先加载,它可以发出一个返回所有结果的查询。
答案 1 :(得分:1)
似乎是Linq对sql的限制:
答案 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;
}