Получает ли Linq все записи первым, если я делаю Count? - PullRequest
7 голосов
/ 18 января 2011

Предположим, у меня есть таблица под названием Population, в которой хранятся некоторые демографические данные. В T-SQL, чтобы подсчитать количество людей старше 50, я мог бы сделать что-то вроде этого:

SELECT COUNT(*) FROM POPULATION
WHERE AGE > 50

Я думал, что следующий оператор linq будет работать, но он просто возвращает ноль, и я не понимаю, почему.

var count = _context.Population.Count(x => x.Age > 50);

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

var count = _context.Populaton.Where(x => x.Age > 50).Count();

var count = _context.Population.Select(x => x.Age > 50).Count();

Почему вышеописанные сценарии имеют место?

Ответы [ 3 ]

2 голосов
/ 18 января 2011

Linq не получает все записи первыми. Откладывает выполнение запроса до последнего возможного момента. Это позволяет оптимизировать запрос.

http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

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

Bob

1 голос
/ 31 марта 2015

Во всех случаях Count() НЕ будет выполнять вычисления в памяти на основе записей, возвращаемых из базы данных, но фактически изменит сгенерированный SQL для включения оператора COUNT. Упрощенная версия вашего сгенерированного запроса TSQL будет выглядеть примерно так:

SELECT 
    COUNT(1)
    FROM [dbo].[Population] AS [Extent1]
    WHERE [Extent1].[Age] > 50

При вызове Count() запрос выполняется немедленно. Все ваши запросы кажутся правильными, поэтому проверьте базу данных, поставщика и контекст, чтобы убедиться, что запрос выполняется правильно.

0 голосов
/ 18 января 2011

Правильно. как и в любом операторе SQL, он имеет определенный порядок, которому вы должны следовать. и если вы рассчитываете на то, где, вы, по сути, не даете ему ничего, чтобы рассчитывать на.

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