2012-01-02 5 views
4

私は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行が返されます。何が問題なの?

+2

SqlProfilerを使用してデータベースに対して実際に何が実行されたかチェックしましたか? – Schotime

+0

実際にはありません。しかし、私はこれがPetaPocoのバグである可能性があると考えています –

+1

多分、db.Fetch ( "; EXEC GetUsersPaged @@ startRowIndex = @ 0、@@ maximumRows = @ 1、@@ name = @ 2"、 startRowIndex、pageSize、name);またはtry:db.Fetch ( "; EXEC @ 0、@ 1、@ 2"、startRowIndex、pageSize、name); - 私はなぜ2番目のものが最初のものよりもうまくいくのか分かりませんが、それを働かせようと試みています(それがまだない場合)。 –

答えて

0

EnableAutoSelect = falseを設定しましたか?これをデフォルト設定のままにしたとき、呼び出しはすべてのレコードを返しました。

関連する問題