Через много часов я наконец понимаю, что правильно работаю с объектом Cache в моем приложении ASP.NET, но мои хранимые процедуры мешают ему работать правильно.
Эта хранимая процедура работает правильно:
CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC'
AS
BEGIN
SELECT ID, [Name], Flag, IsDefault FROM dbo.Languages
END
Но это (то, что я хотел) не:
CREATE PROCEDURE [dbo].[ListLanguages]
@Page INT = 1,
@ItemsPerPage INT = 10,
@OrderBy NVARCHAR (100) = 'ID',
@OrderDirection NVARCHAR(4) = 'DESC',
@TotalRecords INT OUTPUT
AS
BEGIN
SET @TotalRecords = 10
EXEC('SELECT ID, Name, Flag, IsDefault FROM (
SELECT ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ' ' + @OrderDirection + ') as Row, ID, Name, Flag, IsDefault
FROM dbo.Languages) results
WHERE Row BETWEEN ((' + @Page + '-1)*' + @ItemsPerPage + '+1) AND (' + @Page + '*' + @ItemsPerPage + ')')
END
Я дал параметру @TotalRecords значение 10, чтобы вы могли быть уверены, что проблема не в функции COUNT (*), которая, как я знаю, не поддерживается должным образом.
Кроме того, когда я запускаю его из SQL Server Management Studio, он делает именно то, что должен делать. В приложении ASP.NET результаты извлекаются корректно, только кеш как-то не может работать!
Не могли бы вы помочь?
Может быть, намек
Я полагаю, что причина, по которой свойство зависимостей HasChanged связано с тем, что столбец Row, сгенерированный из ROW_NUMBER, является только временным и, следовательно, SQL SERVER не может сказать, изменились ли результаты или нет. Вот почему HasChanged всегда имеет значение true.
Кто-нибудь знает, как разбить на страницы результаты из SQL SERVER без использования функций COUNT или ROW_NUMBER?