2009-06-17 15 views
0

Ich habe ein Datagrid, wo ich die benutzerdefinierte Paging-Option (Ref: http://subsonicproject.com/querying/webcast-using-paging/) im Subsonic-Framework verwenden.Subsonic-Paging-Auftrag Problem

Ich habe auch ein Dropdown, das die Daten nach Status filtert. Dies wird der Abfrage über den Aufruf addwhere hinzugefügt.

Die Daten werden nach Status ASC und dann Stadt ASC sortiert.

Die Daten scheinen in Ordnung zu sein, wenn kein Zustand ausgewählt ist und daher kein addwhere zur Klausel hinzugefügt wird. Wenn Sie jedoch einen Status auswählen, der über genügend Datensätze verfügt, um die Seitennumerierung zu aktivieren, werden einige Datensätze nicht in der richtigen Reihenfolge angezeigt. Ich habe auch bemerkt, dass es immer scheint, dass die letzten paar Datensätze auf der aktuellen Seite irgendwo in der Mitte des Rasters angezeigt werden.

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

Das Problem ist nicht zu erscheinen scheint, wenn ein Zustand ausgewählt ist, und es gibt nur 1 Seite von Daten. Die Standardeinstellung für ddlDisplay ist 100 Datensätze pro Seite. Der Fehler wird jedoch angezeigt, selbst wenn 50 oder 25 ausgewählt wurde.

Mit Subsonic 2.1.0.0

Antwort

0

Verwenden qry.OrderAsc (New String() { "Staat asc, Stadt asc"})

0

Es gibt einen Fehler in PAGING_VIEW_SQL Vorlage zu sein scheint (SqlProvider.cs, Linie 1702). Hier ist der Code-Schnipsel:

... 
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. 

Sie, dass auf den ersten Daten sehen können bestellt sortiert und in eine temporäre Tabelle eingefügt, aber als die erforderliche Seite wird wieder ohne Sortierung abgerufen. Was letztendlich dazu führt, dass die richtigen Daten für die angeforderte Seite erhalten werden, aber ohne richtige Sortierung.

Die zweite select muss geändert werden, damit die Daten in der richtigen Reihenfolge angezeigt werden, wenn sie aus der temporären Tabelle entnommen werden. Wie folgt aus:

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

und anschließend neu kompilieren natürlich den Code und schon kann es losgehen :-)