Linq-to-Sql Count - PullRequest
       1

Linq-to-Sql Count

3 голосов
/ 01 декабря 2010

Мне нужно подсчитать количество элементов в объединенном наборе результатов, где условие истинно. Таким образом, у меня есть тип выражения «от где можно». Это выражение должно заканчиваться select или groupby. Мне данные столбца на самом деле не нужны, и я полагаю, что быстрее их не выбирать:

count = (from e in dc.entries select new {}).Count();

У меня есть 2 вопроса:

  1. Есть ли более быстрый способ сделать это с точки зрения нагрузки на БД?
  2. Я должен дублировать всю мою копию запроса. Есть ли способ структурировать мой запрос, чтобы у меня было одно место как для подсчета, так и для получения списка со всеми полями?

Спасибо.

Пожалуйста, обратите особое внимание:

  1. Запрос является соединением, а не простой таблицей, поэтому я должен использовать оператор select.
  2. Мне понадобятся 2 разных тела запроса, потому что мне не нужно загружать все фактические поля для подсчета, а для списка.

Я предполагаю, что когда я использую запрос выбора, он заполняется данными, когда я использую query.Count vs Table.Count. С нетерпением ждем тех, кто понимает то, что я прошу, о возможных лучших способах сделать это и некоторых подробных знаниях о том, что на самом деле происходит. Мне нужно вытащить записи, чтобы заглянуть в это глубже.

Ответы [ 2 ]

6 голосов
/ 02 декабря 2010

Queryable.Count

Поведение запроса, возникающее в результате выполнения дерева выражений, представляющего вызов Count (IQueryable), зависит от реализации типаисходный параметр.Ожидаемое поведение - подсчет количества элементов в источнике.

Фактически, если вы используете LinqToSql или LinqToEntities, Queryable.Count() отправляется в базу данных.Столбцы не загружены в память.Проверьте сгенерированный sql для подтверждения.


Я предполагаю, что при использовании запроса на выборку он заполняется данными, когда я использую query.Count vs Table.Count

Это не правда.Проверьте сгенерированный sql для подтверждения.


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

Если вам нужны и счет, и список, получите список ипосчитайте его.

Если вам нужен подсчет, иногда, а иногда вам нужен список ... напишите метод, который возвращает сложный IQueryable, а иногда вызывайте .Count () и другие вызовы раз .ToList ();


Мне на самом деле не нужны данные столбца, и я полагаю, что таким образом быстрее их не выбирать.

Это в основном неверно в вашем сценарии.Это может быть верно в сценарии, где индекс охватывает столбцы результата, но у вас нет столбцов результата.

В вашем сценарии, какой бы индекс не был выбран оптимизатором запросов, этот индекс может использоваться длясделайте счет.

Суммируйте: Оптимизатор запросов выполнит желаемую оптимизацию.

1 голос
/ 01 декабря 2010
//you can put a where condition here    
var queryEntries = from e in dc.entries select e;
//Get count 
queryEntries.Count();
//Loop through Entries, so you basically returned all entries
foreach(entry en in queryEntries)
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...