Почему GetPaged () выполняет два вызова базы данных? - PullRequest
0 голосов
/ 06 января 2010

Я немного новичок в subsonic (то есть, оцениваю 3.0.0.3) и столкнулся со странным поведением в GetPaged (int pageIndex, int pageSize). Когда я выполняю метод, он делает два вызова SQL. Есть идеи почему?

Подробнее

Допустим, у меня есть таблица "Культуры" с 200 строками. В моем коде я делаю что-то вроде ...

var sonicCollection = from c in RTE.Culture.GetPaged(1, 25)
                       select c;

Теперь я ожидаю, что это выполнит один запрос, возвращающий первые 25 записей в моей таблице культур. Когда я смотрю профилировщик SQL, я вижу два запущенных запроса.

Первый это -

SELECT [dbo].[Cultures].[cultureCode], [dbo].[Cultures].[cultureName]
FROM [dbo].[Cultures]

Тогда это -

SELECT *
FROM     (SELECT ROW_NUMBER() OVER (
    ORDER BY cultureID ASC) AS Row, 
    [dbo].[Cultures].[cultureCode], [dbo].[Cultures].[cultureName]
 FROM [dbo].[Cultures]
)
AS PagedResults
WHERE  Row >= 1 AND Row <= 25

Я ожидаю, что второй запрос будет пролонгирован, поскольку он возвращает 25 строк, которые я вежливо запросил от дозвукового. Первый запрос, однако, возвращает 200 строк (по крайней мере, согласно профилировщику SQL).

Есть идеи, что происходит?

Ответы [ 2 ]

1 голос
/ 19 марта 2011

Это ошибка в коде. Код фактически запрашивает каждую запись, а затем перебирает каждую для подсчета. Я создал проблему в репозитории github здесь: https://github.com/subsonic/SubSonic-3.0/issues/259

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

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

Вы просто хотите использовать RTE.Culture.GetPaged () - он запускает постраничный запрос для вас.

...