2015-09-06 3 views
0

Я работаю над проектом C# и использую SQL Server 2008 R2 express в качестве backend.Оптимизация запроса C# LINQ

Мне нужно найти количество заказов, где BookingDate's Date component больше, чем tempDate.

Я написал следующий код:

DateTime tempDate = new DateTime(DateTime.Now.Year, 4, 1); //<= 5ms 
var bookings = context.Bookings.Where(x => x.IsDeleted == false).ToList(); //<= 2ms 
var count = bookings.Count(x => x.BookingDate.Date >= tempDate); //<= 2,534 ms 

Этот код работает и дает мне правильный подсчет, но его принимают почти 3 секунды, чтобы выполнить (я нашел время выполнения с помощью VS 2015). Я хочу оптимизировать этот код, чтобы сократить время выполнения. Таблица бронирования содержит почти 20 000 записей.

Как свести к минимуму затраты на вычисление?

+0

Проблема, скорее всего, вызов ToList(), который выбирает все к сторона клиента. –

+0

@ba__другой: можете ли вы предложить обходное решение –

+0

ToList() не требуется для подсчета заказов, просто удалите его. Затем EF генерирует только оператор SQL в форме 'SELECT COUNT (*) FROM' .. –

ответ

3

Оказывается, мой предыдущий ответ был не таким уж хорошим. Я провел некоторое тестирование, используя таблицу с 10 000 объектов и используя .ToList() время от 280 мс до 380 мс. Также я обнаружил, что выбор .Date не работает в запросах linq, поэтому вам нужно делать .ToList(). Если вы хотите выбрать count в запросе, вы не можете использовать DateTime.Date, вам нужно использовать только DateTime.

2,500 мс довольно медленно. Если вы запустите приложение в режиме деблокирования, это, вероятно, будет намного быстрее.


DateTime tempDate = new DateTime(DateTime.Now.Year, 4, 1); 
int count = context.Bookings.Count(x => x.IsDeleted == false && x.BookingDate >= tempDate); 

Проблема заключается в .ToList(), как он запрашивает все строки таблицы, а не только графа

+0

Visual Studio показывает время выполнения другим способом. Я обновил код, размещенный в вопросе, со временем выполнения. Также мне нужен список заказов позже в коде. Я опубликовал только часть кода, где стоимость исполнения больше –

+1

Возможно [TruncateTime()] (https://msdn.microsoft.com/en-us/library/dd395596 (v = vs.110) .aspx) стоит выстрел? –

+0

эй ребята ... большое спасибо ... Я удалил вызов ToList() и удалил свойство .Date из BookingDate, как было предложено. теперь его просто берут 106 мс. Это значительное улучшение ... –

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