我正在使用EntityFramework 6与官方MySQL提供商。
我有一个包含VenuePlans列表的数据库,每个VenuePlans都包含Areas。 为了显示这些值,我使用了这个非常简单的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查看执行的查询时,我发现这会导致重复查询,如下所示:
检索VenuePlans:
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的实例。
我该怎么做才能防止这种行为?
答案 0 :(得分:0)
我从来没有发现MySql Linq的东西非常好。我最近使用它,并且不得不使用ToList,而不是我希望停止从喷出的乱码中生成查询。
知道Linq到MySql已经坏了,而且不仅仅是你,你最好使用从你的上下文而不是你的对象流出的查询版本。
话虽如此,我很有兴趣看看是否有人有解决方案,因为我倾向于在使用MySql时避开Linq。