Я написал программу , которая тестирует три различных алгоритма. Также это хороший источник информации: Тысяча способов упаковать мусорное ведро - практический подход к упаковке двухмерного прямоугольного мусорного ведра . Он предназначен для двумерного прямоугольника, но вы всегда можете преобразовать его в 3D.
Синтаксис запроса:
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.
Что ж, даже 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
Я думаю, вам нужно что-то вроде
var count = context.MyTable.Count(t => t.MyContainer.ID == '1');
(отредактировано для отражения комментариев)
Я думаю, это должно сработать ...
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();