2016-08-16 5 views
0

У меня есть таблица в моей базе данных, которая имеет поле даты (VisitDate). Когда я выполнить следующий SQL запрос, я получаю результаты в 1 секунду:GroupBy() работает очень медленно

select year(VisitDate), month(visitDate) 
from GABrowser 
group by year(VisitDate), month(visitDate) 

Однако в моем ASP.Net коде (в Visual Basic), последующие занимает 12 секунд, чтобы выполнить:

Dim stats = db.GABrowsers.GroupBy(Function(s) New With {s.VisitDate.Value.Year, s.VisitDate.Value.Month}) 

'(Takes 12 seconds to enter in the For loop) 
For Each stat In stats 

Next 

Я не знаю, почему это так долго. Это приводит к тому, что мои веб-страницы загружаются очень медленно.

+0

Необходимо посмотреть, что делает SQL Server. Можете ли вы запустить профилировщик SQL, чтобы узнать, какие команды отправляют ваше приложение на SQL Server? Затем вы увидите, что работает и как долго. –

+0

Создайте кластерный указатель для VisitDate и опубликуйте свой SQL-запрос с помощью EF Profiler –

+0

Я никогда не слышал о профилировщике SQL. Где я могу запустить это? – AskYous

ответ

3

SQL-запрос и запрос LINQ не эквивалентны.

SQL-запрос возвращает только year(VisitDate) и month(visitDate). GroupBy в LINQ отличается тем, что возвращает полные объекты, которые сгруппированы по условию группировки.

В результате LINQ вы увидите db.GABrowsers объектов в идентичных s.VisitDate.Value.Year и s.VisitDate.Value.Month. Вы увидите, что SQL-запрос, сгенерированный оператором LINQ, намного шире (в полях), чем первый SQL-запрос.

Кроме того (для большего набора результатов SQL) для EF требуется время для обработки данных из базы данных и материализации объектов объекта.

+1

Я думаю, было бы полезно, если бы вы разместили эквивалентный запрос LINQ. – Enigmativity

+1

Просто добавьте '.Select (Функция (g) g.Key)' в конце запроса. –

+0

@IvanStoev Не уверен, что OP фактически хочет получить тот же результат из инструкции LINQ или что они попробовали инструкцию SQL *, предполагая, что она эквивалентна. Было бы интересно посмотреть, что происходит в цикле 'For'. Конечно, если они хотят воспроизвести результат SQL, выбор «Key» сделает это. –

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