Как я могу отсортировать DataSet перед выполнением DataBind?
-
04-07-2019 - |
Вопрос
У меня есть данные, поступающие из базы данных в виде 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";