2016-03-24 9 views
1

Моя проблема заключается в том, что каждый раз, когда я загружаю это представление, мое приложение отправляет 249 идентичных запросов в базу данных. Первоначально я использовал ленивую загрузку, и количество запросов было двойным.Несколько запросов БД, когда Eager Loading in Entity Framework 6

Номер 249, приведенный выше, представляет количество строк, возвращаемых этим запросом.

Я понимаю, что .Include создает соединение, которое должно устранить это поведение?

Может ли кто-нибудь сказать мне, как устранить это дублирование запросов?

Cheers!

Код ниже является псевдокодом и не предназначен для компиляции.

Контроллер:

var apples = _unitOfWork.Context.Apples 
    .Include(x=> x.AppleTypes) 
    .OrderByDescending(x => x.Id) 
    .Where(x => x.Status == (int)AppleStatusConstants.New 
      && x.IsRejected != true && x.AppleManId != null); 

return View(apples); 

Вид:

@model IEnumerable<Apple> 

@Html.DisplayNameFor(model => model.AppleTypes.TypeSeason) 
@foreach (var item in Model){ 
     @Html.DisplayFor(modelItem => item.AppleTypes.TypeSeason) 
     } 

трассировки SQL из Glimpse:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Type] AS [Type], 
[Extent2].[Id] AS [Id1], 
[Extent2].[TypeSeason] AS [TypeSeason], 

FROM [dbo].[Apples] AS [Extent1] 
LEFT OUTER JOIN [dbo].[AppleTypes] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id] 
WHERE (0 = [Extent1].[Status]) AND (NOT ((1 = [Extent1].[IsRejected]) AND ([Extent1].[IsRejected] IS NOT NULL))) AND ([Extent1].[OrgUnitId] IS NOT NULL) 
ORDER BY [Extent1].[Id] DESC 

Glimpse Скриншот enter image description here

ответ

1

Multiple DB запросы, когда жадная загрузка в Entity Framework 6

Вы не сказали его нетерпеливой нагрузку на базовые запросе, только это входит.

Этот код:

var apples = _unitOfWork.Context.Apples 
    .Include(x=> x.AppleTypes) 
    .OrderByDescending(x => x.Id) 
    .Where(x => x.Status == (int)AppleStatusConstants.New 
     && x.IsRejected != true && x.AppleManId != null); 

является создание IQueryable<T>. Простое решение - добавить .ToList() в конец.

.Where(x => x.Status == (int)AppleStatusConstants.New 
    && x.IsRejected != true && x.AppleManId != null) 
    .ToList(); 

Так что в вашем коде, это преступник:

@foreach (var item in Model){ 

Это вызывает EF для запроса одного объекта одновременно.

PS: Следующие заявления идентичны (если вы не переопределены object.cshtml)

@foreach (var item in Model){ 
    @Html.DisplayFor(modelItem => item.AppleTypes.TypeSeason) 
} 

и

@Html.DisplayFor(m => m) 

и

@Html.DisplayForModel() 
+0

Является .ToList() более дорогостоящая операция? Один из старших программистов здесь поощряет меня не к пользователю .ToList() по возможности –

+0

Нет никакого хорошего ответа. Это просто зависит. Бывают случаи, когда '.ToList() '- правильное решение и время, когда это не так. –