问题:GridView / ObjectDataSource的排序根据页面而变化

时间:2009-08-05 04:43:39

标签: gridview objectdatasource data-access-layer

我使用分页将GridView绑定到ObjectDataSource。分页工作正常,但排序顺序会根据正在查看的结果页面而变化。这会导致项目在后续页面中重新出现以及其他问题。我将问题追溯到我的DAL,它一次读取一个页面然后对其进行排序。显然,随着结果集大小的变化,排序会发生变化。这个算法有改进吗?如果可能,我想使用datareader:

    [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
    public static WordsCollection LoadForCriteria(string sqlCriteria, int maximumRows, int startRowIndex, string sortExpression)
    {
        //DEFAULT SORT EXPRESSION
        if (string.IsNullOrEmpty(sortExpression)) sortExpression = "OrderBy";
        //CREATE THE DYNAMIC SQL TO LOAD OBJECT
        StringBuilder selectQuery = new StringBuilder();
        selectQuery.Append("SELECT");
        if (maximumRows > 0) selectQuery.Append(" TOP " + (startRowIndex + maximumRows).ToString());
        selectQuery.Append(" " + Words.GetColumnNames(string.Empty));
        selectQuery.Append(" FROM sw_Words");
        string whereClause = string.IsNullOrEmpty(sqlCriteria) ? string.Empty : " WHERE " + sqlCriteria;
        selectQuery.Append(whereClause);
        selectQuery.Append(" ORDER BY " + sortExpression);
        Database database = Token.Instance.Database;
        DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString());
        //EXECUTE THE COMMAND
        WordsCollection results = new WordsCollection();
        int thisIndex = 0;
        int rowCount = 0;
        using (IDataReader dr = database.ExecuteReader(selectCommand))
        {
            while (dr.Read() && ((maximumRows < 1) || (rowCount < maximumRows)))
            {
                if (thisIndex >= startRowIndex)
                {
                    Words varWords = new Words();
                    Words.LoadDataReader(varWords, dr);
                    results.Add(varWords);
                    rowCount++;
                }
                thisIndex++;
            }
            dr.Close();
        }
        return results;
    }

1 个答案:

答案 0 :(得分:0)

我通过阅读MSDN找到了解决这个问题的方法。诀窍是执行完整查询并仅返回有趣的子集,排序始终是一致的。但是,该过程仅适用于SQL 2005。

    [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
    public static WordsCollection LoadForCriteria(string sqlCriteria, int maximumRows, int startRowIndex, string sortExpression)
    {
        //DEFAULT SORT EXPRESSION
        if (string.IsNullOrEmpty(sortExpression)) sortExpression = "OrderBy";
        //CREATE THE DYNAMIC SQL TO LOAD OBJECT
        StringBuilder selectQuery = new StringBuilder();
        selectQuery.Append("SELECT ");
        selectQuery.Append(Words.GetColumnNames(string.Empty));
        selectQuery.Append(" FROM (");
        selectQuery.Append("SELECT ");
        selectQuery.Append(Words.GetColumnNames(string.Empty));
        selectQuery.Append(", ROW_NUMBER() OVER (ORDER BY " + sortExpression + ") AS RowRank");
        selectQuery.Append(" FROM sw_Words) AS WordsWithRowNumbers");
        selectQuery.Append(" WHERE RowRank >" + startRowIndex.ToString() + " AND " + "RowRank <=" + (startRowIndex + maximumRows).ToString());
        string whereClause = string.IsNullOrEmpty(sqlCriteria) ? string.Empty : " AND " + sqlCriteria;
        selectQuery.Append(whereClause);
        Database database = Token.Instance.Database;
        DbCommand selectCommand = database.GetSqlStringCommand(selectQuery.ToString());
        //EXECUTE THE COMMAND
        WordsCollection results = new WordsCollection();
        int rowCount = 0;
        using (IDataReader dr = database.ExecuteReader(selectCommand))
        {
            while (dr.Read())
            {
                Words varWords = new Words();
                Words.LoadDataReader(varWords, dr);
                results.Add(varWords);
                rowCount++;
            }
            dr.Close();
        }
        return results;
    }