2015-08-04 6 views
-1

Я изучаю LINQ, и особенно LINQ to SQL на MSDN, и наткнулся на этот пример, который, если только не есть какая-то умная магия под капотом, выглядит как случай крайней жертвы вычислительных ресурсов над читабельностью кода..NET LINQ to SQL query efficiency

int highScoreCount = 
    (from score in scores 
    where score > 80 
    select score) 
    .Count(); 

Кто-то, пожалуйста, сообщите мне, что этот запрос не загружает все баллы в списке, чтобы получить их счет. Или даже не оценки более 80.

И если это так для этого конкретного запроса, нужно ли это изменить его, чтобы избежать загрузки полного списка баллов? как «выбор (подсчет) баллов».

Спасибо.

EDIT: Я прошу прощения за то, что я ленив и не ищу способ сначала просмотреть сгенерированный SQL. Я нашел, что самый простой способ сделать это - использовать LinqPad

+2

ОК, он не загружает все оценки в списке, чтобы получить их счет! – DavidG

+0

Серьезно, правда, вы пробовали смотреть на SQL, который он производит? – DavidG

+2

http://stackoverflow.com/questions/4899974/how-to-view-linq-generated-sql-statements – jleach

ответ

5

первая часть вашего утверждения внутри() фактически вычисляет IQueryable, который еще не был выполнен. Когда вы вызываете функцию Count(), она компилирует и оценивает запрос следующим образом:

SELECT 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    COUNT(1) AS [A1] 
    FROM [dbo].[scores] AS [Extent1] 
    WHERE [Extent1].[score] > 80 
) AS [GroupBy1] 
3

Кто-то, пожалуйста, скажите мне, что этот запрос не загружает все баллы в списке, чтобы получить их счет. Или даже не баллы за 80.

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

SELECT COUNT(*) As Count FROM MyTable WHERE Score > 80; 

и вернуть это значение вам.

Вы можете проверить это самостоятельно, изучив SQL, который отправляется в базу данных. Либо путем включения профилирования в самой базе данных, либо путем использования трассировки: How to view LINQ Generated SQL statements?

2

LINQ довольно умен в отношении того, как он получает данные ... может быть, не такой умный, как оптимизатор запросов, но он может сделать некоторые вещи правильно. Вы можете легко заглянуть в SQL, сгенерированный им. Следующий пост объясняет:

How to view LINQ Generated SQL statements?