Как я могу отсортировать DataSet перед выполнением DataBind?

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

Вопрос

У меня есть данные, поступающие из базы данных в виде DataSet. Затем я устанавливаю его как DataSource элемента управления сеткой перед выполнением DataBind(). Я хочу отсортировать DataTable / <=> по одному столбцу. Этот столбец сложен для сортировки в базе данных, но я надеялся, что смогу отсортировать его, как если бы я сортировал общий список, т. Е. Используя разделитель.

Возможно ли это или мне нужно перенести его в другую структуру данных?

Изменить . Мне кажется, что ни один из этих ответов не работает для меня, потому что я использую .Net 2.0.

Это было полезно?

Решение

Из-за того, как работает сортировка DataTable (и DataView), вы не можете напрямую использовать делегированный подход. Одним из обходных путей является добавление столбца в таблицу данных, представляющего порядок, и установка значения (для каждой строки) на основе требуемой последовательности. Затем вы можете добавить сортировку к представлению в этом новом столбце. Например (используя LINQ для сортировки, просто для краткости):

var sorted = table.Rows.Cast<DataRow>().OrderBy(row => your code);
int sequence = 0;
foreach(var row in sorted)
{
    row["sequence"] = sequence++;
}

(если у вас есть типизированный набор данных, то я не думаю, что вам нужен шаг Cast, или вы бы использовали ваш типизированный подкласс DataRow)

[изменить, чтобы включить 2.0]

В 2.0 (т. е. без LINQ и т. д.) вы могли бы использовать List<T> для сортировки - немного более многословно, но:

        List<DataRow> sorted = new List<DataRow>();
        foreach(DataRow row in table.Rows)
        {
            sorted.Add(row);
        }
        sorted.Sort(delegate(DataRow x, DataRow y) { your code });
        int sequence = 0;
        foreach(DataRow row in sorted)
        {
            row["sequence"] = sequence++;
        }

(снова замените DataRow, если вы используете типизированный набор данных)

Другие советы

Я думаю, что DataView.Sort собственность поможет. Вы можете получить к нему доступ через DataTable.DefaultView .

Если вы не возражаете против потери управления / сортировки на элементе управления, вы можете использовать что-то вроде:

var dt = new DataTable();
gvWhatever.DataSource = dt.Select().ToList().Sort();

И эта сортировка будет принимать IComparables и т. д. в соответствии с перегрузками, так что вы можете сортировать, как вам нравится.

protected void grdResult_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dt = ((DataTable)Session["myDatatable"]);
        grdResult.DataSource = dt;
        DataTable dataTable = grdResult.DataSource as DataTable;

    //Code added to fix issue with sorting for Date datatype fields
    if (dataTable != null)
    {   

        DataView dataView = new DataView(dataTable);
        for (int i = 0; i < dataView.Table.Rows.Count; i++)
        {
            try
            {
                dataView.Table.Rows[i]["RESP_DUE_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RESP_DUE_DT"]));
                dataView.Table.Rows[i]["RECD_DT"] = common.FormatDateWithYYYYMMDD(Convert.ToDateTime(dataView.Table.Rows[i]["RECD_DT"]));
            }
            catch (Exception ex)
            {

            }
        }

        dataView.Sort = "[" + e.SortExpression + "]" + " " + GetSortDirection(e.SortExpression);

        for (int i = 0; i < dataView.Table.Rows.Count; i++)
        {
            try
            {
                dataView.AllowEdit = true;
                dataView[i].BeginEdit();
                dataView[i]["RESP_DUE_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RESP_DUE_DT"].ToString());
                dataView[i]["RECD_DT"] = common.FormatDateFromStringYYYYMMDD(dataView[i]["RECD_DT"].ToString());
            }
            catch (Exception ex)
            {

            }
        }
        //End code added to fix the issue with sorting for Date data type fields


        grdResult.DataSource = dataView;
        grdResult.DataBind();


    }
}

Вы можете отсортировать базу данных в памяти, но я не знаю, что & слишком сложно для сортировки в базе данных " было бы. На вашем месте я бы попытался отсортировать его в базе данных, использовать представления, индексы избыточности, сложные операторы SQL. Вероятно, это будет быстрее, чем сортировка большого набора данных в памяти, с дополнительным преимуществом, заключающимся в сохранении сортировки для других. тип клиентов (например, веб-сервисы и т. д.)

Почему столбец сложный для сортировки в базе данных ? Предполагается, что сложность сортировки будет одинаковой в базе данных или в структуре, если, конечно, это не вычисляемый столбец, и даже в этом случае я предполагаю, что сортировка в БД все еще быстрее.

Однако, как сказал Джон, вы можете изменить сортировку на уровне формы через свойство DataView.Sort. Я бы рекомендовал делать это, если это занимает слишком много времени, и в этом случае было бы полезно кэшировать результаты.

Вы можете сделать это с помощью

myTableName.DefaultView.Sort = "MyFieldName DESC";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top