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

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

2 голосов
/ 20 января 2010

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

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

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

Select count(*) from ...

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

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

Ответы [ 5 ]

1 голос
/ 20 января 2010

Проверьте журнал 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 голос
/ 20 января 2010

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

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

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

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

Удивительно, а?Еще один автор сделал действительно хорошее предложение получить LinqPad - это замечательный инструмент.Он покажет вам точный SQL, который выполняется.Вы всегда можете подтвердить это с помощью SQL profiler.

1 голос
/ 20 января 2010

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

1 голос
/ 20 января 2010

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

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

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

1 голос
/ 20 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...