私はPetaPocoで、データベースにカスタムページングを持つ検索ソリューション(明らかにいくつかの検索パラメータ付き)を実装することになっています。私は、ASP.NET DataPagerでPetaPocoページングを構成する方法を理解できませんでした(これはまったく別の質問です)。とにかく私はデータベースでカスタムページングを使いたいです。PetaPocoを使用してパラメータ化されたストアドプロシージャを実行する
:今、私は以下のようなこれらのストアドprocsのを呼び出すための2つのメソッドを持っているALTER PROCEDURE [dbo].[GetUsersCount]
@name nvarchar(300) = NULL,
@email nvarchar(100) = NULL
AS
BEGIN
SELECT COUNT(*)
FROM UserInfo
WHERE
(Nickname LIKE '%'[email protected]+'%'
OR FirstName LIKE '%'[email protected]+'%'
OR LastName LIKE '%'[email protected]+'%'
OR @name IS NULL)
AND
(Email = @email OR @email IS NULL)
END
:ストアドプロシージャ以下のような
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 '%'[email protected]+'%'
OR FirstName LIKE '%'[email protected]+'%'
OR LastName LIKE '%'[email protected]+'%'
OR @name IS NULL)
AND
(Email = @email OR @email IS NULL)
) AS UsersPagedList
WHERE RowRank BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows)
END
とGetUsersCount
:
は、私がストアドプロシージャは、以下のようなGetUsersPaged
と呼ばれています
[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>();
}
私の質問は次のとおりです。実行時にすべてが正常です格納されたprocsをdbでテストします(SQL Management Studio内)。すべての結果は、ページングパラメータを基準にしています。しかし、PetaPocoを使って同じストアドプロシージャを呼び出すと、すべてのものがフェッチされ、ページングは無視されます。例えば
私は
@startRowIndex = 0
@maximumRows = 1
でSQL Management Studioで保存されprocsのをテストし、私は@name
と@email
のために何を送信していないとき、それは完全に正確である1行のみを返します。しかし、PetaPocoで同じことをすると、リストに3行が返されます。何が問題なの?
SqlProfilerを使用してデータベースに対して実際に何が実行されたかチェックしましたか? – Schotime
実際にはありません。しかし、私はこれがPetaPocoのバグである可能性があると考えています –
多分、db.Fetch( "; EXEC GetUsersPaged @@ startRowIndex = @ 0、@@ maximumRows = @ 1、@@ name = @ 2"、 startRowIndex、pageSize、name);またはtry:db.Fetch ( "; EXEC @ 0、@ 1、@ 2"、startRowIndex、pageSize、name); - 私はなぜ2番目のものが最初のものよりもうまくいくのか分かりませんが、それを働かせようと試みています(それがまだない場合)。 –