2015-03-15 2 views
0

Я использую 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.

Что можно сделать, чтобы предотвратить это поведение?

ответ

0

Я никогда не находил материал MySql Linq очень хорошим. Я использовал его недавно, и мне пришлось использовать ToList раньше, чем мне хотелось бы прекратить генерировать запрос из-за брандмауэра.

Вооружившись тем, что Linq to MySql сломан, и это не только вы, вам лучше всего использовать версию запроса, текущую из вашего контекста, а не из вашего объекта.

Сказав это, мне было бы интересно узнать, есть ли у кого-нибудь решение, потому что я стараюсь избегать Linq при использовании MySql.

+0

Я действительно понял, что лучше писать объединения и т. Д. Самостоятельно, непосредственно в контексте, вместо того, чтобы полагаться на Linq на MySQL. Слава богу за Miniprofiler, я бы никогда не узнал, что это было так плохо ;-) –

+0

Два сценария были идентичны по сути, и здесь есть проблема с MySql Linq. –

Смежные вопросы