使用 LINQ 分隔数据表中的所有列并存储到另一个数据表
本文关键字:数据表 存储 另一个 LINQ 分隔 使用 | 更新日期: 2023-09-27 17:56:05
我有一个超过 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();
解决方案 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);
}
}
工作示例
一种在不定义列名的情况下区分表的方法
var dtPurchaseOrder = dt
.AsEnumerable()
.Distinct(DataRowComparer.Default)
.CopyToDataTable<DataRow>();