EntityFramework MySQL检索计数结果

时间:2015-03-15 16:41:13

标签: c# mysql linq entity-framework count

我正在使用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的实例。

我该怎么做才能防止这种行为?

1 个答案:

答案 0 :(得分:0)

我从来没有发现MySql Linq的东西非常好。我最近使用它,并且不得不使用ToList,而不是我希望停止从喷出的乱码中生成查询。

知道Linq到MySql已经坏了,而且不仅仅是你,你最好使用从你的上下文而不是你的对象流出的查询版本。

话虽如此,我很有兴趣看看是否有人有解决方案,因为我倾向于在使用MySql时避开Linq。