【问题标题】:Distinct all columns in a datatable and store to another datatable with LINQ区分数据表中的所有列并使用 LINQ 存储到另一个数据表
【发布时间】:2015-06-15 03:01:07
【问题描述】:

我有一个超过 10 列的数据表,我想区分所有列,然后将结果存储到另一个数据表。

有没有办法通过使用 LINQ 来区分数据表中的所有列而不命名所有列?

我已经尝试了下面的代码,但它只给出了一行。请给我任何建议。

DataTable dtPurchaseOrder = new DataTable();
DataTable dt = new DataTable();
dt.Columns.Add("PONumber");
dt.Columns.Add("Customer");
dt.Columns.Add("Address");
dt.Rows.Add("PO123456", "MH", "123");
dt.Rows.Add("PO123456", "MH", "123");
dt.Rows.Add("PO654321", "AB", "123");
dt.Rows.Add("PO654321", "AB", "123");

foreach (DataRow r in dt.Rows)
{
    var lstPO = (from row in dtPurchaseOrder.AsEnumerable()
                 select row.Field<string>("PONumber")).Count();
    if (lstPO == 0)
        dtPurchaseOrder.Rows.Add(r.ItemArray);
}

dtPurchaseOrder.AcceptChanges();

【问题讨论】:

  • PrimaryKey 定义为您的Datatable
  • @HariPrasad 谢谢你的回复。请给我更多关于数据表中 PrimaryKey 的信息?
  • 您可能会使用String.Join 和行的ItemArray 创建一个代表整行的String,然后获得不同的值。

标签: c# linq


【解决方案1】:

解决方案 1:

最简单的解决方案是DefaultView.ToTable

dt.DefaultView.ToTable(true, "PONumber", "Customer", "Address");

解决方案 2:

另一种选择是使用Linq 语句过滤不同的行,然后根据需要循环它们。

var result =  dt.AsEnumerable()
            .Select(row => new {
                PONumber = row.Field<string>("PONumber"),
                Customer = row.Field<string>("Customer"),
                Address = row.Field<string>("Address")
            }).Distinct();

解决方案 3:

使用PrimaryKey 定义检查存在的传统方式。

var ponum = dtPurchaseOrder.Columns.Add("PONumber");
var cust = dtPurchaseOrder.Columns.Add("Customer");
var address = dtPurchaseOrder.Columns.Add("Address");


dtPurchaseOrder.PrimaryKey =  new[] {ponum, cust, address};

dt.Rows.Add("PO123456", "MH", "123");
dt.Rows.Add("PO654321", "AB", "123");
dt.Rows.Add("PO654321", "AB", "123");



foreach (DataRow r in dt.Rows)
{
    var exisiting = dtPurchaseOrder.Rows.Find(r.ItemArray);

    if (exisiting == null)  
    {
        dtPurchaseOrder.Rows.Add(r.ItemArray);
    }       
}   

工作Sample

【讨论】:

  • 感谢您提供的所有解决方案。这很好用。但是,我收到一个错误,DataColum 不能是null。如何让列可以为空AllowDBNull
【解决方案2】:

一种无需定义列名即可区分表的方法

var dtPurchaseOrder = dt
                      .AsEnumerable()
                      .Distinct(DataRowComparer.Default)
                      .CopyToDataTable<DataRow>();

【讨论】:

  • 感谢您的代码。我试过了,但数据表没有绑定到我的 DataGridView。
  • 我所要做的就是将dtPurchaseOrder 转换回 dt。这正是我所需要的。即。 dt = (Datatable)dtPurchaseOrder;
猜你喜欢
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多