【问题标题】:How to sort datatable and keep primary keys?如何对数据表进行排序并保留主键?
【发布时间】:2016-03-19 15:04:21
【问题描述】:

我有一个包含 6 列的数据表 (dt)(S1、S2、S3 是 string,D1、D2、D3 是 double)。 string 列(S1、S2、S3)的组合构成了我的 PrimaryKey:

dt.PrimaryKey = new DataColumn[] 
{ dt.Columns["S1"], dt.Columns["S2"], dt.Columns["S3"] };

现在,我想按 D1、D2、D3 对 dt 进行排序并将其保存为数据表。 这是我得到的:

DataView view = new DataView(dt);
view.Sort = "D1, D2, D3";
dt = view.ToTable();

问题是 dt 是按照我想要的方式排序的,因为我丢失了 PrimaryKeys。我试图用dt = view.Table.Copy(); 替换第三行,它保留了PrimaryKeys,但排序不起作用。我也尝试使用LINQ (How to sort DataTable based on multiple column?) 并检查了这一趋势 (DataTable.DefaultView.Sort Doesn't Sort),但它们都没有奏效。

我做错了吗?非常感谢任何帮助。

【问题讨论】:

  • 您是否尝试在 view.Table.Copy 之后设置 DefaultView.Sort 属性?

标签: c# sorting datatable primary-key


【解决方案1】:

每个 DataTable 都有一个 DefaultView 属性,允许您在不创建主表副本的情况下设置排序。

如果您将 DefaultView.Sort 属性设置为您想要的排序顺序,然后遍历 DefaultView 而不是 DataTable,您将按照所需的确切顺序获取行

dt.DefaultView.Sort = "D1, D2, D3";
foreach(DataRowView dr in dt.DefaultView)
   Console.WriteLine("D1=" + dr["D1"].ToString() + 
                   ", D2=" + dr["D2"].ToString() + 
                   ", D3=" + dr["D3"].ToString());

如果你还想新建一个表,那么你需要在新表中重新创建主键列.....

//Get the primarykey column names
List<string> names = dt.PrimaryKey
                       .Cast<DataColumn>()
                       .Select(x => x.ColumnName)
                       .ToList();
// New table
DataTable dt2 = dt.Copy();
// Get the array of datacolumns that match the name of the other table primary
DataColumn[] keys = dt2.Columns
                       .Cast<DataColumn>()
                       .Where(x => names.Contains(x.ColumnName))
                       .ToArray();

// Set the primary in the copied table
dt2.PrimaryKey = keys;

【讨论】:

  • 谢谢史蒂夫。您的代码有效,但如果我想将此排序后的版本保存回 dt 甚至另一个数据表中,我应该循环遍历它吗?
  • 如果您将结果分配回原始 dt 变量,您将销毁它并创建一个新变量。这当然是可能的,但正如您所见,您丢失了原始表中设置的 PrimaryKey。但是,您可以简单地获取主键中列的名称并在新表中重建它
  • 由于我需要有主键列,我将尝试你的代码(或检查我是否可以在排序后定义主键以避免额外的代码)。感谢您的帮助
【解决方案2】:

更短的方法是:

var brandNewTable = dw.ToTable();

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2019-03-12
    • 2021-11-03
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多