Проблема дозвукового пейджинга - PullRequest
0 голосов
/ 17 июня 2009

У меня есть сетка данных, в которой я использую пользовательский параметр подкачки (ref: http://subsonicproject.com/querying/webcast-using-paging/) в Subsonic framework.

У меня также есть раскрывающийся список, который фильтрует данные по состоянию. Это добавляется к запросу через вызов addwhere.

данные заказываются государственным ASC, а затем городским ASC.

данные кажутся упорядоченными в порядке, когда не выбрано ни одного состояния, и, следовательно, в предложение не добавляется нигде. Но если вы выберете состояние, в котором достаточно записей, чтобы вызвать разбиение на страницы, то некоторые записи отображаются не по порядку. Я также заметил, что всегда кажется, что последние несколько записей на текущей странице отображаются где-то посередине сетки.

фрагмент кода к загрузочной сетке:

    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 голосов
/ 05 октября 2009

Кажется, есть ошибка в шаблоне 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}

, а затем, конечно же, перекомпилируйте код и начинайте: -)

0 голосов
/ 15 июля 2009

Использовать qry.OrderAsc (New String () {"state asc, city asc"})

...