У меня была аналогичная проблема, но я нашел для нее 100% -ное рабочее решение.
& lt;? php function super_unique ($ array, $ key) {$ temp_array = []; foreach ($ array as & amp; $ v) {if (! isset ($ temp_array [$ v [$ key]])) $ temp_array [$ v [$ key]] = & amp; $ V; } $ array = array_values ($ temp_array); return $ array; } $ arr = ""; $ Обр [0] [ 'ID'] = 0; $ Обр [0] [ 'TITEL'] = "ABC"; $ Обр [1] [ 'ID'] = 1; $ Обр [1] [ 'TITEL'] = "DEF"; $ Обр [2] [ 'ID'] = 2; $ Обр [2] [ 'TITEL'] = "ABC"; $ Обр [3] [ 'ID'] = 3; $ Обр [3] [ 'Titel'] = "XYZ"; echo "& lt; pre & gt;"; print_r ($ обр); echo "unique ********************* & lt; br / & gt;"; print_r (super_unique ($ обр 'Titel')); ? & GT;
Синтаксис запроса:
var count = (из o в контексте.MyContainer, где o.ID == '1' из t в o.MyTable выберите t) .Count ();
Синтаксис метода:
var count = context.MyContainer .Where (o = & gt; o.ID == '1') .SelectMany (o = & gt; o.MyTable) .Count ()
Оба генерируют один и тот же SQL-запрос.
Я думаю, что это должно сработать ...
var query = from m in context.MyTable, где m.MyContainerId == '1' // или какое бы имя внешнего ключа. .. выберите m; var count = query.Count ();
Используйте метод ExecuteStoreQuery контекста сущности. Это позволяет избежать загрузки всего набора результатов и десериализации в объекты для простого подсчета строк.
int count; используя (var db = new MyDatabase ()) {строка sql = "SELECT COUNT (*) FROM MyTable, где FkId = {0}"; object [] myParams = {1}; var cntQuery = db.ExecuteStoreQuery & lt; int & gt; (sql, myParams); count = cntQuery.First & lt; int & gt; (); }
int count = context.MyTable.Count (m = & gt; m.MyContainerID == '1')
, тогда сгенерированный SQL будет похож на то, что вы делаете, но код много лучше. Никакие объекты не загружаются в память как таковые. Попробуйте в LINQPad, если хотите - он покажет вам SQL, используемый под обложками.
– Drew Noakes
4 August 2012 в 17:27
Я думаю, вам нужно что-то вроде
var count = context.MyTable.Count (t = & gt; t.MyContainer.ID == '1');
(отредактировано для отражения комментариев)
var count = context.MyTable.Count (t = & gt; t.MyContainer.ID == '1');
не длинный и уродливый: var count = (from o в контексте. MyContainer, где o.ID == '1' из t в o.MyTable выберите t) .Count ();
Но это зависит от стиля кодирования ...
– Mantas Janusauskas
8 May 2013 в 13:11
Ну, даже SELECT COUNT (*) FROM Таблица
будет довольно неэффективной, особенно на больших таблицах, поскольку 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 ИЛИ index_id = 1) GROUP BY OBJECT_ID
Это проверит представление динамического управления и извлечет из него количество строк и размер таблицы, учитывая определенную таблицу. Он делает это путем суммирования записей для кучи (index_id = 0) или кластеризованного индекса (index_id = 1).
Это быстро, легко использовать, но не гарантируется точность 100% или обновляться. Но во многих случаях это «достаточно хорошо» (и на сервере накладывается гораздо меньше нагрузки).
Может быть, это сработает и для вас? Конечно, чтобы использовать его в EF, вам придется обернуть это в хранимой процедуре или использовать прямой вызов «Выполнять SQL-запрос».
Marc
Как я понимаю, выбранный ответ все еще загружает все связанные тесты. Согласно этому блогу msdn, есть лучший способ.
В частности
с использованием (var context = new UnicornsContext ()) var princess = context.Princesses.Find (1); // Считаем, сколько единорогов принадлежит принцессе var unicornHaul = context.Entry (princess) .Collection (p = & gt; p.Unicorns) .Query () .Count (); }
Find (1)
. Просто создайте сущность и прикрепите к контексту: var princess = new PrincessEntity {Id = 1}; context.Princesses.Attach (принцесса);
– tenbits
4 February 2016 в 17:27
Это мой код:
IQueryable & lt; AuctionRecord & gt; records = db.AuctionRecord; var count = records.Count ();
Убедитесь, что переменная определена как IQueryable, а затем, когда вы используете метод Count (), EF выполнит что-то вроде
select count (*) from. ..
В противном случае, если записи определены как IEnumerable, созданный sql будет запрашивать всю таблицу и подсчитывать возвращаемые строки.
SelectMany ()
? Это необходимо? Не будет ли это работать без него? – Jo Smo 4 July 2015 в 17:29