Как мы можем оптимизировать этот запрос linq to entity, чтобы уменьшить время отклика?
-
19-09-2019 - |
Вопрос
IQueryable<WebEvent> mySearch =
eventDC.GetBooks()
.Where(p => p.Price.Any(d => d.EventDatetime.Month == fromDate.Month
&& d.EventDatetime.Year == fromDate.Year))
.WithGroup(groupId)
.OrderBy(p => p.Price.Where(r => r.Datetime >= fromDate)
.OrderBy(q => q.Datetime)
.FirstOrDefault().Datetime);
List<Book>ventsList = mySearch.ToList<Book>();
У нас такой длинный запрос, и на получение книг и сортировку уходит много времени, после тестирования производительности мы обнаружили, что время отклика для страницы, содержащей этот запрос, превышает 10 секунд, и нам нужно попытаться решить эту проблему и сократить время отклика.
У кого - нибудь есть какие - нибудь предложения ?
Решение
Обычно изучайте SQL, чтобы увидеть, что он выдает, что вы можете сделать встроенным.Существует инструмент, который может помочь вам сделать это, он называется LINQPad, и вы можете создать запрос LINQ и поиграть с настройкой запроса LINQ.Кроме того, ищу места для добавления индексов;это также может ускорить производительность (слишком много индексов может снизить производительность, поэтому будьте осторожны).
Другие советы
Что именно ты пытаешься сделать?Можете ли вы дать мне представление о приведенной здесь схеме?
Мне это кажется странным утверждением, поскольку я не знаю схемы:
p => p.Цена.Любая (d => d.Дата события.Месяц...
Тем не менее, я собираюсь рискнуть в темноте и сказать, что у вас могут возникнуть проблемы с:
eventDC.getBooks()
если этот метод вызывает хранимую процедуру или иным образом выполняет "Выбрать * из книг" в базе данных, то то, что вы на самом деле делаете, это:
- Выбор ВСЕХ книг из базы данных
- Возьмите полученный список и выберите из него только те книги, которые вам нужны
Если это так, то это, вероятно, ваша самая большая проблема.