При использовании пропуска и переноса на страницу данных, как я могу получить общее количество записей без отдельного запроса? - PullRequest
2 голосов
/ 24 марта 2010

Я не понимаю, как это возможно, но я действительно, очень не хочу выполнять мой запрос дополнительное время, просто чтобы получить количество записей, чтобы я мог создать пейджер. Когда я говорю «пейджер», я просто имею в виду общую штуковину со ссылкой, например, на каждые 10 записей.

Ответы [ 4 ]

0 голосов
/ 01 марта 2013

Меня беспокоил этот же вопрос. Вот результаты моих экспериментов в Linqpad - фактическое поведение Linq не создает полностью новый запрос к серверу SQL:

Этот простой тест в одной из моих баз данных для разработки:

var query = from p in HrPersons select p;

var x = query.Skip(20).Take(10).Dump();

var t = query.Count().Dump();

генерирует следующие фактические запросы SQL:

SELECT [t1].[company] AS [Company], [t1].[processLevel] AS [ProcessLevel], [t1].[emplId] AS [EmplId], [t1].[sn] AS [Sn], [t1].[givenName] AS [GivenName], [t1].[middleInitial] AS [MiddleInitial], [t1].[nickName] AS [NickName], [t1].[formerName] AS [FormerName], [t1].[ssn] AS [Ssn], [t1].[cn] AS [Cn], [t1].[costCenter] AS [CostCenter], [t1].[title] AS [Title], [t1].[status] AS [Status], [t1].[batch] AS [Batch], [t1].[rowversion] AS [Rowversion], [t1].[id] AS [Id], [t1].[source] AS [Source]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[company], [t0].[processLevel], [t0].[emplId], [t0].[sn], [t0].[givenName], [t0].[middleInitial], [t0].[nickName], [t0].[formerName], [t0].[ssn], [t0].[cn], [t0].[costCenter], [t0].[title], [t0].[status], [t0].[batch], [t0].[rowversion], [t0].[id], [t0].[source]) AS [ROW_NUMBER], [t0].[company], [t0].[processLevel], [t0].[emplId], [t0].[sn], [t0].[givenName], [t0].[middleInitial], [t0].[nickName], [t0].[formerName], [t0].[ssn], [t0].[cn], [t0].[costCenter], [t0].[title], [t0].[status], [t0].[batch], [t0].[rowversion], [t0].[id], [t0].[source]
    FROM [HrPerson] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
GO

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

Таким образом, хотя является вторым запросом SQL, он является тривиальным, который запрашивает только общее количество. Я считаю, что это разумно и приемлемо как шаблон.

0 голосов
/ 24 марта 2010

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

И, я имею в виду, лучше всего читать код из одного запроса, а не из двух. Вы по-прежнему будете выполнять две отдельные оценки в базе данных. Используйте анализатор запросов, чтобы увидеть, являются ли операторы «Select Count», а затем «Select take» или «грязный большой выбор», урезанный LINQ после получения. Я думаю, что LINQ делает первое.

0 голосов
/ 25 марта 2010

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

0 голосов
/ 24 марта 2010

Насколько я знаю, невозможно вернуть общее количество и элементы, полученные с помощью пропуска и забрать одновременно.

...