使用列表中的 AddRange 会导致多次数据库访问
Using AddRange from a list causes multiple database trips
这是我继承的代码,不是我设计的。
正在进行一个大查询以返回对象列表。然后使用查询结果创建自定义对象列表。有大量的循环并存在以获取不同的值,例如县、州等。为了优化代码,我试图 select 来自查询结果的不同值并将它们添加到新集合中使用添加范围。但是,这会导致为每个值调用 SQL。
初始查询
using (var db = new StorageEntities())
{
db.Configuration.AutoDetectChangesEnabled = false;
List<CompanyTitleFeeSchedule> list = db.CompanyTitleFeeScheduleCompanies
.Include(x => x.Company)
.Include(x => x.CompanyTitleFeeSchedule)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleCompanies)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas.Select(t => t.County))
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas.Select(t => t.County.State))
.Where(x => x.CompanyID == id || x.Company.ParentCompanyID == id)
.Select(x => x.CompanyTitleFeeSchedule).Distinct().ToList();
return list.Select(item => new VM.CompanyTitleFeeScheduleViewModel(item)).ToList();
}
** 在具有 CountyViewModel 列表的构造函数 VM.CompanyTitleFeeScheduleViewModel 中,我试图用查询结果中的不同县填充它。这导致调用每个不同县的数据库。即使我需要的值已经在查询结果中。既然已经枚举了列表,为什么实体还需要返回数据库呢? **
//Get a list of distinct counties and add them to the collection
Counties.AddRange((from c in data.CompanyTitleFeeScheduleAreas
group c by c.CountyID
into cty
select cty.First())
.Select(cty => new CountyViewModel
{
CountyID = cty.CountyID,
Name = cty.County.Name,
StateID = cty.County.StateID
}));
我已经有几年没有使用 EF 了,但上次我使用时,您通常需要使用 Include
来加载相关实体以及查询。否则,相关实体会根据需要延迟加载。
喜欢:
...
.Select(x => x.CompanyTitleFeeSchedule)
.Include(x => x.CompanyTitleFeeScheduleAreas) // added this.
...
有关详细信息,请参阅:Loading Related Entities
那个post也告诉你如何在各种情况下禁用延迟加载。
这是我继承的代码,不是我设计的。
正在进行一个大查询以返回对象列表。然后使用查询结果创建自定义对象列表。有大量的循环并存在以获取不同的值,例如县、州等。为了优化代码,我试图 select 来自查询结果的不同值并将它们添加到新集合中使用添加范围。但是,这会导致为每个值调用 SQL。
初始查询
using (var db = new StorageEntities())
{
db.Configuration.AutoDetectChangesEnabled = false;
List<CompanyTitleFeeSchedule> list = db.CompanyTitleFeeScheduleCompanies
.Include(x => x.Company)
.Include(x => x.CompanyTitleFeeSchedule)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleCompanies)
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas.Select(t => t.County))
.Include(x => x.CompanyTitleFeeSchedule.CompanyTitleFeeScheduleAreas.Select(t => t.County.State))
.Where(x => x.CompanyID == id || x.Company.ParentCompanyID == id)
.Select(x => x.CompanyTitleFeeSchedule).Distinct().ToList();
return list.Select(item => new VM.CompanyTitleFeeScheduleViewModel(item)).ToList();
}
** 在具有 CountyViewModel 列表的构造函数 VM.CompanyTitleFeeScheduleViewModel 中,我试图用查询结果中的不同县填充它。这导致调用每个不同县的数据库。即使我需要的值已经在查询结果中。既然已经枚举了列表,为什么实体还需要返回数据库呢? **
//Get a list of distinct counties and add them to the collection
Counties.AddRange((from c in data.CompanyTitleFeeScheduleAreas
group c by c.CountyID
into cty
select cty.First())
.Select(cty => new CountyViewModel
{
CountyID = cty.CountyID,
Name = cty.County.Name,
StateID = cty.County.StateID
}));
我已经有几年没有使用 EF 了,但上次我使用时,您通常需要使用 Include
来加载相关实体以及查询。否则,相关实体会根据需要延迟加载。
喜欢:
...
.Select(x => x.CompanyTitleFeeSchedule)
.Include(x => x.CompanyTitleFeeScheduleAreas) // added this.
...
有关详细信息,请参阅:Loading Related Entities
那个post也告诉你如何在各种情况下禁用延迟加载。