المشكلة: الفرز للGridView / ObjectDataSource يتغير اعتمادا على الصفحة

StackOverflow https://stackoverflow.com/questions/1231229

سؤال

ولدي 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;
    }
هل كانت مفيدة؟

المحلول

ولقد وجدت حلا لهذه المشكلة من قراءة 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;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top