【发布时间】:2015-03-15 16:41:12
【问题描述】:
我将 EntityFramework 6 与官方 MySQL 提供程序一起使用。
我有一个数据库,其中包含一个场地计划列表,每个场地计划都由区域组成。 为了显示这些值,我使用了这个非常简单的 LINQ 查询:
model.VenuePlans = CurrentOrganization.VenuePlans.Select(p => new ViewModels.VenuePlans.IndexViewModel.VenuePlan
{
ID = p.MaskID,
Name = p.DisplayName,
AreaCount = p.VenuePlans_Areas.Count()
}).ToArray();
但是当使用 MiniProfiler 查看执行的查询时,我发现这会导致重复查询,如下所示:
检索场地计划:
SELECT
`Extent1`.`PlanID`,
`Extent1`.`MaskID`,
`Extent1`.`DisplayName`,
`Extent1`.`OrganizationID`,
`Extent1`.`SVG`
FROM `VenuePlans` AS `Extent1`
WHERE `Extent1`.`OrganizationID` = @EntityKeyValue1
检索第一个 VenuePlan 的区域:
SELECT
`Extent1`.`AreaID`,
`Extent1`.`PlanID`,
`Extent1`.`DisplayName`,
`Extent1`.`MaskID`,
`Extent1`.`FillColor`,
`Extent1`.`InternalName`
FROM `VenuePlans_Areas` AS `Extent1`
WHERE `Extent1`.`PlanID` = @EntityKeyValue1
现在对数据库中存在的每个区域重复后一个查询。
CurrentOrganization 是之前检索到的另一个模型的实例。 现在直接在 DbContext 实例上编写查询时,我没有这个问题:
model.VenuePlans = DbContext.VenuePlans
.Where(p => p.OrganizationID == CurrentOrganization.OrganizationID)
.Select(p => new ViewModels.VenuePlans.IndexViewModel.VenuePlan
{
ID = p.MaskID,
Name = p.DisplayName,
AreaCount = p.VenuePlans_Areas.Count()
}).ToArray();
这是什么原因?
DbContext 是在我的 BaseController 中声明的变量,它返回存储在 HttpRequest.Items 中的当前 DbContext 的实例。
我可以做些什么来防止这种行为?
【问题讨论】:
标签: c# mysql linq entity-framework count