2009-08-05 3 views
0

ページビューを使用してObjectDataSourceに関連付けられたGridViewがあります。結果のどのページが表示されているかによってソート順が変わることを除いて、ページングは​​正常に動作します。これにより、アイテムは他の問題の中で次のページに再び表示されます。問題をDALにたどりました。私のDALは、一度にページを読み込んでから並べ替えます。明らかに、ソートは結果セットのサイズが変わると変わります。このアルゴリズムに改善がありますか?可能であれば、データウェアハウスを使用したいと思います。問題:ページに応じてGridView/ObjectDataSourceのソートが変更される

[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; 
    } 

答えて

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; 
    } 
関連する問題