linq sql - общее количество

2

У меня есть некоторый linq, который возвращает правильные данные.

var numEmails = (from row in EmailBatchProposal  
where row.EmailBatchId == emailBatchId
select row.EmailBatchProposalId).Count();

Однако, если я правильно понимаю linq, это не выполняется оптимально. Он захватывает все данные, а затем просматривает список и подсчитывает строки. Мне бы очень хотелось использовать linq (в фоновом режиме), например:

Select count(*) from ...

Я уверен, что причины производительности очевидны.

Кто-нибудь знает правильный способ сделать это?

Теги:
linq-to-sql

5 ответов

1
Лучший ответ

На самом деле, если запрос linq используется с коллекцией, которая реализует IQueryable и поддерживает перевод в базовый вариант SQL, это довольно простая функциональность, позволяющая правильно перевести функцию Count из вашего примера.

1

Вы можете просто использовать аргумент .Count().

int numEmails = EmailBatchProposal.Count(x => x.EmailBatchId == emailBatchId)

Как отмечено ниже, это фактически не разрешает какой-либо другой SQL, но я думаю, что это по крайней мере более чистая альтернатива.

  • 2
    Это не отличается ... это просто другой способ написать тот же запрос. SQL, который фактически выполняется внутри, точно такой же.
  • 0
    В чем разница между этими двумя версиями? Пока вы не форсируете выполнение запроса с помощью ToArray () или чего-то подобного, я думаю, что не имеет значения, используете ли вы Count с лямбда-выражением или Count в конце.
Показать ещё 1 комментарий
1

Проверьте журнал SQL, используемый в запросе.

        using (var dbc = new siteDataContext())
        {
            dbc.Log = Console.Out;
            var bd = (from b in dbc.birthdays
                     select b).Count();
            Console.WriteLine("{0}", bd);
        }

дает запрос:

SELECT COUNT(*) AS [value]
FROM [dbo].[birthdays] AS [t0]
 -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
1

Собственно, LINQ-to-SQL достаточно умен, чтобы знать, что он должен делать подсчет... Например, если у меня есть следующий запрос:

var v = (from u in TblUsers
        select u).Count();

SQL, который фактически выполняется, когда я запускаю это:

SELECT COUNT(*) AS [value]
FROM [tblUsers] AS [t0]

Удивительно, а? Другой плакат сделал действительно хорошее предложение получить LinqPad - это ЧУДЕСНЫЙ инструмент. Он покажет вам точный SQL, который будет выполнен. Вы всегда можете подтвердить с помощью профайлера SQL.

  • 0
    Ах, я был слишком медленным. :) Голосуй!
1

Люди обычно лучше всего учатся, практикуя. Я бы предложил вам получить копию LinqPad (бесплатно), ввести в ваш запрос Linq и посмотреть, какой SQL он генерирует. Затем вы можете изменить запрос Linq, пока не получите именно то, что хотите.

  • 0
    Отличная идея, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню