0

Subsonicフレームワークでカスタムページングオプション(参照:http ://subsonicproject.com/querying/webcast-using-paging/ )を使用しているデータグリッドがあります。

状態でデータをフィルタリングするドロップダウンもあります。これは、addwhere呼び出しを介してクエリに追加されます。

データは、州のASC、次に市のASCの順に並べられます。

状態が選択されていないため、句にaddwhereが追加されていない場合、データは正常に順序付けられているように見えます。ただし、ページ付けを開始するのに十分なレコードがある状態を選択すると、一部のレコードが順不同で表示されます。また、現在のページの最後の数レコードがグリッドの中央のどこかに表示されているように見えることにも気づきました。

loadgridへのコードスニペット:

    Dim qry As New SubSonic.Query( {myTableSchema} )
    If ddlStates.SelectedValue.Trim.ToLower <> "all states" Then
        qry.AddWhere("state", ddlStates.SelectedValue.Trim)
    End If
    qry.ORDER_BY("state", "ASC").ORDER_BY("city", "ASC")
    qry.PageSize = ddlDisplay.SelectedValue
    qry.PageIndex = pageNumber
    gvOrganizers.DataSource = qry.ExecuteDataSet
    gvOrganizers.DataBind()

状態が選択され、データが1ページしかない場合、問題は発生しないようです。デフォルトのddlDisplay設定は1ページあたり100レコードですが、50または25を選択してもエラーが表示されます。

Subsonic2.1.0.0の使用

4

2 に答える 2

0

PAGING_VIEW_SQLテンプレートにバグがあるようです( SqlProvider.cs、1702 行目)。スニペットは次のとおりです。

...
SELECT _indexID = IDENTITY(int, 1, 1), {1} INTO #temp FROM {0} WHERE 1 = 0
INSERT INTO #temp ({1}) SELECT {1} FROM {0} {2} {3}

SELECT * FROM #temp
WHERE _indexID BETWEEN ((@Page - 1) * @PageSize + 1) AND (@Page * @PageSize)

--clean up  
DROP TABLE #temp", where {3} represents serialized order-by-collection.

最初に、並べ替えられたデータが並べ替えられて一時テーブルに挿入されますが、再度並べ替えを行わずに必要なページが取得されることがわかります。最終的に、要求されたページの適切なデータを取得することになりますが、適切な並べ替えは行われません。

2 番目selectは、データが一時テーブルから取得されたときに正しい順序になるように変更する必要があります。このような:

SELECT * FROM #temp    
WHERE _indexID BETWEEN ((@Page - 1) * @PageSize + 1) AND (@Page * @PageSize) {3}

そしてもちろん、コードを再コンパイルしてください:-)

于 2009-10-05T15:30:15.717 に答える
0

qry.OrderAsc (New String(){"state asc, city asc"})を使用

于 2009-07-15T00:24:26.347 に答える