Проблема дозвукового пейджингового порядка

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

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

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

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

фрагмент кода для 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


person Community    schedule 17.06.2009    source источник


Ответы (2)


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

person Rick Ratayczak    schedule 15.07.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}

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

person Pavel K.    schedule 05.10.2009