【问题标题】:How to find duplicate record using Linq from DataTable如何使用来自 DataTable 的 Linq 查找重复记录
【发布时间】:2012-01-20 09:55:15
【问题描述】:

这是我的数据表

DataTable dt = new DataTable();
dt.Rows.Add(2,Test1,Sample1);
dt.Rows.Add(2,Test2,Sample2);
dt.Rows.Add(4,Test3,Sample3);
dt.Rows.Add(4,Test4,Sample4);
dt.Rows.Add(2,Test5,Sample5);

我想显示消息 Duplicate record exists for class 4 通过比较使用两个循环是可能的,但我想要一个优化的代码,它将返回重复记录,我将显示一条消息。该代码可能正在使用 Linq,如果有人知道请分享..?

【问题讨论】:

  • 什么是“4级”?什么时候有重复?

标签: linq datatable


【解决方案1】:

假设当第一列的值对于两行或多行相同时,您得到一条重复记录:

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1);

这是一个例子:

DataTable dt = new DataTable();
dt.Columns.Add();
dt.Columns.Add();
dt.Columns.Add();
dt.Rows.Add(1, "Test1", "Sample1");
dt.Rows.Add(2, "Test2", "Sample2");
dt.Rows.Add(3, "Test3", "Sample3");
dt.Rows.Add(4, "Test4", "Sample4");
dt.Rows.Add(5, "Test5", "Sample5");

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList();
Console.WriteLine("Duplicate found: {0}", duplicates.Any());

dt.Rows.Add(1, "Test6", "Sample6");  // Duplicate on 1
dt.Rows.Add(1, "Test6", "Sample6");  // Duplicate on 1
dt.Rows.Add(3, "Test6", "Sample6");  // Duplicate on 3
dt.Rows.Add(5, "Test6", "Sample6");  // Duplicate on 5

duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList();
if (duplicates.Any())
    Console.WriteLine("Duplicate found for Classes: {0}", String.Join(", ", duplicates.Select(dupl => dupl.Key)));

Console.ReadLine();

【讨论】:

  • 如果缺少 AsEnumerable(),添加对 System.Data.DataTableExtensions 的引用
【解决方案2】:

您可以获得两个 LINQ 查询或结果的相交。 相交意味着找到两个 LINQ 结果之间的共同记录。

这是一个例子。

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    DataColumn dc;
    DataRow dr;
    ds.DataSetName = "products";
    dt.TableName = "product";

    dc = new DataColumn("product_id",long.MaxValue.GetType());
    dt.Columns.Add(dc);

    dc = new DataColumn("product_name");
    dt.Columns.Add(dc);

    dr = dt.NewRow();
    dr["product_id"] = 1;
    dr["product_name"] = "Monitor";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 2;
    dr["product_name"] = "Mouse";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 3;
    dr["product_name"] = "KeyBoard";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 4;
    dr["product_name"] = "LCD";
    dt.Rows.Add(dr);

    ds.Tables.Add(dt);

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable()
                                   where tbl.Field<long>(0) >=3
                                   select tbl;



    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable()
                                   let product_name = tbl.Field<string>(1)
                                   where product_name.StartsWith("Key")
                                   || product_name.StartsWith("Mo")
                                   select tbl;




    IEnumerable<DataRow> objUnionResult = objResult1.Intersect(objResult2);

    Response.Write("<br/><br/><b>Intersect Query Results</b>");
    foreach (DataRow row in objUnionResult)
    {
        Response.Write(string.Format("<br/>Product ID: {0} ,  Product Name: {1}", row.Field<long>(0), row.Field<string>(1)));
    }
    Response.Write("<br/><br/>");

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 2021-06-28
    • 2013-03-22
    • 2013-02-03
    • 2015-02-14
    • 1970-01-01
    • 2021-05-28
    • 2019-09-24
    相关资源
    最近更新 更多