代码之家  ›  专栏  ›  技术社区  ›  ATL_DEV

问题:根据页面对GridView/ObjectDataSource更改进行排序

  •  0
  • ATL_DEV  · 技术社区  · 17 年前

    我使用分页将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 回复  |  直到 17 年前
        1
  •  0
  •   ATL_DEV    17 年前

    我通过阅读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;
        }
    
    推荐文章