2009-06-17 9 views
0

J'ai un DataGrid où je suis en utilisant l'option d'échange personnalisée (ref: http://subsonicproject.com/querying/webcast-using-paging/) dans le cadre subsonique.problème Subsonic-Paging-Order

J'ai aussi un menu déroulant qui filtre les données par l'Etat. Ceci est ajouté à la requête via l'appel addwhere.

les données est ordonnée par l'état ASC et ville ASC.

les données semble être commandés très bien quand aucun état est sélectionné et donc pas addwhere est ajouté à la clause. Mais si vous sélectionnez un état qui a suffisamment d'enregistrements pour provoquer la pagination, certains enregistrements sont affichés dans le désordre. J'ai également remarqué qu'il semble toujours que les derniers enregistrements sur la page actuelle sont affichés quelque part au milieu de la grille.

bout de code à 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() 

Le problème ne semble pas apparaître lorsqu'un état est sélectionné et il y a seulement 1 page de données. Le paramètre ddlDisplay par défaut est 100 enregistrements par page mais l'erreur apparaît même si 50 ou 25 est choisi.

En utilisant Subsonic 2.1.0.0

Répondre

0

Utilisez qry.OrderAsc (New String() { "état asc, ville asc"})

0

Il semble y avoir un bug dans PAGING_VIEW_SQL modèle (SqlProvider.cs, ligne 1702). Voici l'extrait:

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

Vous pouvez voir que dans un premier temps les données commandées sont triées et insérées dans une table temporaire, mais que la page requise est récupérée sans tri à nouveau. Ce qui aboutit finalement à obtenir les bonnes données pour la page demandée mais sans un tri approprié.

Le deuxième select doit être modifié de sorte que les données soient dans le bon ordre lorsqu'elles sont extraites de la table temporaire. Comme ceci:

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

puis recompiler bien sûr le code et vous voilà parti :-)