низкая производительность при использовании сущностей linq 2 - PullRequest
1 голос
/ 02 апреля 2012

Я строю сайт фильма.Я использую MVC3 и сущности.Я использую в основном LINQ to Entities для запроса базы данных.GUI сайта в основном представляет собой одну страницу просмотра, которая помимо первой загрузки, я использую в основном Ajax для обновления списка фильмов в соответствии с критериями поиска и тому подобное.Поэтому я использую один основной запрос.Когда я проверяю это в режиме отладки, я вижу, что каждый раз выполнение запроса занимает 10 секунд, что, конечно, очень медленно.Я проиндексировал базу данных в соответствии с моими базовыми знаниями.Вот основной код запроса:

 var casts = MovieCasts.Where(d => 
           movieIds.Contains(d.MovieId) 
           && d.WorkingTitleId != null &&             
           actorAndActressWtIds.Contains((int)d.WorkingTitleId)).AsEnumerable()
           .Where(d=>GetMoviesTop4CelebIds(d.MovieId).Contains(d.CelebId))
           .AsQueryable()
           .Select(d =>new MCast
           {
               MovieId = d.MovieId,
               Id = d.Id,
               CelebId = d.CelebId,
               CelebPageViews = d.Celebrity.PageViews,
               ActingParts = string.Join(",",d.ActingParts.Select(e => e.Name)),
               ActorName = HttpUtility.HtmlDecode(d.Celebrity.ShortName) ??             
                           HttpUtility.HtmlDecode(d.Celebrity.BirthName),
                           }).ToList(); 

GetMoviesTop4CelebIds () - это функция, которая напрямую обращается к базе данных и возвращает короткий список int (celebId) в соответствии с идентификатором фильма.Вот почему я использовал первый AsEnumerable (), иначе он выдал ошибку «LINQ to Entities не распознает метод и не может перевести ...» (забавная вещь, которую я должен упомянуть, это то, что мой код работает медленно в режиме отладки, когда я используюточки останова и быстро без него. Это в разработке. В производстве код очень медленный.) Может кто-нибудь, пожалуйста, помогите мне пролить свет на код?Мне бы очень хотелось и нужно улучшить производительность.

1 Ответ

2 голосов
/ 02 апреля 2012

Вызов AsEnumerable() выполнит запрос Linq to Entities в этой точке и вызовет выполнение остальной части операции с использованием Linq to Objects. Попробуйте выполнить GetMoviesTop4CelebIds() отдельно перед тем, как выполнить этот запрос и использовать результирующие значения в запросе вместо вызова метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...