Как СЧИТАТЬ строки в EntityFramework, не загружая содержание?

Я написал программу , которая тестирует три различных алгоритма. Также это хороший источник информации: Тысяча способов упаковать мусорное ведро - практический подход к упаковке двухмерного прямоугольного мусорного ведра . Он предназначен для двумерного прямоугольника, но вы всегда можете преобразовать его в 3D.

102
задан NVRAM 22 May 2009 в 17:27
поделиться

4 ответа

Синтаксис запроса:

var count = (from o in context.MyContainer
             where o.ID == '1'
             from t in o.MyTable
             select t).Count();

Синтаксис метода:

var count = context.MyContainer
            .Where(o => o.ID == '1')
            .SelectMany(o => o.MyTable)
            .Count()

Оба генерируют один и тот же запрос SQL.

115
ответ дан 24 November 2019 в 04:30
поделиться

Что ж, даже SELECT COUNT (*) FROM Table будет довольно неэффективным, особенно для больших таблиц, поскольку SQL Server действительно ничего не может сделать, кроме как полностью сканирование таблицы (сканирование кластерного индекса).

Иногда достаточно знать приблизительное количество строк из базы данных, и в таком случае может хватить такого оператора:

SELECT 
    SUM(used_page_count) * 8 AS SizeKB,
    SUM(row_count) AS [RowCount], 
    OBJECT_NAME(OBJECT_ID) AS TableName
FROM 
    sys.dm_db_partition_stats
WHERE 
    OBJECT_ID = OBJECT_ID('YourTableNameHere')
    AND (index_id = 0 OR index_id = 1)
GROUP BY 
    OBJECT_ID

Это проверит динамическое представление управления и извлечет количество строк и размер таблицы из нее, учитывая конкретную таблицу. Это достигается путем суммирования записей для кучи (index_id = 0) или кластерного индекса (index_id = 1).

Это быстро, легко в использовании, но не гарантирует 100% точности или актуальности. . Но во многих случаях это «достаточно хорошо» (и значительно снижает нагрузку на сервер).

Может, это сработает и для вас? Конечно, чтобы использовать его в EF, вам придется заключить это в сохраненную процедуру или использовать прямой вызов «Выполнить SQL-запрос».

Marc

9
ответ дан 24 November 2019 в 04:30
поделиться

Я думаю, вам нужно что-то вроде

var count = context.MyTable.Count(t => t.MyContainer.ID == '1');

(отредактировано для отражения комментариев)

44
ответ дан 24 November 2019 в 04:30
поделиться

Я думаю, это должно сработать ...

var query = from m in context.MyTable
            where m.MyContainerId == '1' // or what ever the foreign key name is...
            select m;

var count = query.Count();
2
ответ дан 24 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: