Subsonic-Paging-Order问题

时间:2009-06-17 16:01:34

标签: sorting subsonic custompaging

我有一个数据网格,我在Subsonic框架中使用自定义分页选项(ref: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设置是每页100条记录,但即使选择了50或25,也会出现错误。

使用Subsonic 2.1.0.0

2 个答案:

答案 0 :(得分:0)

使用 qry.OrderAsc(New String(){“state asc,city asc”})

答案 1 :(得分: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.

您可以看到,首先对有序数据进行排序并将其插入到临时表中,但检索到所需页面时不再进行排序。这最终导致获取所请求页面的正确数据,但没有正确排序。

需要修改第二个select,以便在从临时表中获取数据时,数据的顺序正确。像这样:

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

然后当然重新编译代码然后离开: - )