Я использую EntityFramework 6 с официальным провайдером MySQL.EntityFramework MySQL извлекает результаты для подсчета
У меня есть база данных, содержащая список VenuePlans, каждый из которых состоит из областей. Для того, чтобы показать эти значения я использую это очень простой 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, которая возвращает экземпляр текущего DbContext, хранящегося в HttpRequest.Items.
Что можно сделать, чтобы предотвратить это поведение?
Я действительно понял, что лучше писать объединения и т. Д. Самостоятельно, непосредственно в контексте, вместо того, чтобы полагаться на Linq на MySQL. Слава богу за Miniprofiler, я бы никогда не узнал, что это было так плохо ;-) –
Два сценария были идентичны по сути, и здесь есть проблема с MySql Linq. –