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()

The problem doesn't seem to appear when a state is selected and there is only 1 page of data. 默认 ddlDisplay 设置为每页 100 条记录,但即使选择 50 或 25 也会出现错误。

使用亚音速 2.1.0.0

4

2 回答 2

0

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

于 2009-07-15T00:24:26.347 回答
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}

然后当然是重新编译代码然后你就走了:-)

于 2009-10-05T15:30:15.717 回答