Уже два дня я борюсь с PetaPoco, чтобы реализовать поисковое решение (очевидно, с некоторыми параметрами поиска), которое имеет настраиваемый пейджинг в базе данных.Я не мог понять, как настроить пейджинг PetaPoco с ASP.NET DataPager (это совсем другой вопрос).В любом случае я хочу использовать пользовательский пейджинг в базе данных.
У меня есть сохраненный процесс с именем GetUsersPaged
, как показано ниже:
ALTER PROCEDURE [dbo].[GetUsersPaged]
@startRowIndex int,
@maximumRows int,
@name nvarchar(300) = NULL,
@email nvarchar(100) = NULL
AS
BEGIN
SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER(ORDER BY Id) AS RowRank
FROM UserInfo
WHERE
(Nickname LIKE '%'+@name+'%'
OR FirstName LIKE '%'+@name+'%'
OR LastName LIKE '%'+@name+'%'
OR @name IS NULL)
AND
(Email = @email OR @email IS NULL)
) AS UsersPagedList
WHERE RowRank BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows)
END
и GetUsersCount
, сохраненный процесс, как показано ниже:
ALTER PROCEDURE [dbo].[GetUsersCount]
@name nvarchar(300) = NULL,
@email nvarchar(100) = NULL
AS
BEGIN
SELECT COUNT(*)
FROM UserInfo
WHERE
(Nickname LIKE '%'+@name+'%'
OR FirstName LIKE '%'+@name+'%'
OR LastName LIKE '%'+@name+'%'
OR @name IS NULL)
AND
(Email = @email OR @email IS NULL)
END
Теперь у меня есть два метода для вызова этих хранимых процедур, как показано ниже:
[DataObjectMethod(DataObjectMethodType.Select, false)]
public List<DAL.UserInfo> GetPagedUserSearchResults(int startRowIndex, int pageSize, string name, string email)
{
DBService dbService = new DBService();
var db = dbService.GetDatabase();
var list = new List<DAL.UserInfo>();
if(name != string.Empty && email != string.Empty)
list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1,
@@name = @2, @@email = @3", startRowIndex, pageSize, name, email);
else if(name == string.Empty && email != string.Empty)
list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1,
@@email = @2", startRowIndex, pageSize, email);
else if(name != string.Empty && email == string.Empty)
list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1,
@@name = @2", startRowIndex, pageSize, name);
else if(name == string.Empty && email == string.Empty)
list = db.Fetch<DAL.UserInfo>(@"EXEC GetUsersPaged @@startRowIndex = @0, @@maximumRows = @1"
,startRowIndex, pageSize);
return list;
}
[DataObjectMethod(DataObjectMethodType.Select, false)]
public int GetPagedUserSearchResultsCount(string name, string email)
{
DBService dbService = new DBService();
var db = dbService.GetDatabase();
IEnumerable<DAL.UserInfo> count = null;
if (name != string.Empty && email != string.Empty)
count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@name = @0, @@email = @1", name, email);
else if (name == string.Empty && email != string.Empty)
count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@email = @0", email);
else if(name != string.Empty && email == string.Empty)
count = db.Query<DAL.UserInfo>("EXEC GetUsersCount @@name = @0", name);
else if (name == string.Empty && email == string.Empty)
count = db.Query<DAL.UserInfo>("EXEC GetUsersCount");
return count.Count<DAL.UserInfo>();
}
Мой вопрос: все хорошо, когда я выполняю и проверяю хранимые процессы в БД (в SQL Management Studio)).Все результаты относятся к параметрам подкачки.Но когда я вызываю одни и те же хранимые процедуры с помощью PetaPoco, он получает все, и подкачка игнорируется.
Например, когда я тестирую хранимые процедуры в SQL Management Studio с помощью
@startRowIndex = 0
@maximumRows = 1
, и я ничего не отправляю для @name
и @email
, он возвращает только одну строку, котораясовершенно правильно.Но то же самое с PetaPoco, он возвращает 3 строки в списке.Есть идеи, в чем проблема?