使用LINQ获取存在于一个DataTable中但不存在于另一个DataTable中的内容

本文关键字:DataTable 另一个 不存在 存在 于一个 LINQ 使用 获取 | 更新日期: 2023-09-27 18:05:12

我有两个DataTable。我想要得到在第一个中存在但在第二个中不存在的东西。我想要另一个DataTable的结果。我想使用LINQ.

  • 第一个数据表:

DataTable dt1 = cc1roleDAL.GetAll(x, 0);
    第二个数据表:

DataTable dt2 = cc1roleDAL.GetSpecific(x);

注意:我从两个数据表返回的列名:

  1. crs_name

  2. name

使用LINQ获取存在于一个DataTable中但不存在于另一个DataTable中的内容

这将为您完成任务:

var rowsOnlyInDt1 = dt1.AsEnumerable().Where(r => !dt2.AsEnumerable()
                    //make sure there aren't any matching names in dt2
                    .Any(r2 => r["crs_name"].Trim().ToLower() == r2["crs_name"].Trim().ToLower() && r["name"].Trim().ToLower() == r2["name"].Trim().ToLower()));

或者如果您喜欢查询语法:

var rowsOnlyInDt1 = from r in dt1.AsEnumerable()
                    //make sure there aren't any matching names in dt2
                    where !dt2.AsEnumerable().Any(r2 => r["crs_name"].Trim().ToLower() == r2["crs_name"].Trim().ToLower() && r["name"].Trim().ToLower() == r2["name"].Trim().ToLower())
                    select r;

然后可以使用CopyToDataTable函数将结果放入数据表中:

DataTable result = rowsOnlyInDt1.CopyToDataTable();

您想使用Except扩展名

这是MSDN上的链接。

我从这个问题中得到的信息是这样的。

var theNonIntersect = 
    dt1.AsEnumerable().select(r => r.Field<string>("crs_name"), r.Field<string>("name"))
        .Except(dt2.AsEnumerable().select(r => r.Field<string>("crs_name"), r.Field<string>("name")));

你好,希望这段代码对你有帮助,如果我有误解,然后可以问我编辑这篇文章

DataContext db = new DataContext();
var result  = from a in db.dt1
              from b in db.dt2
              where a.crs_name != b.name
              select a.crs_names;
foreach(var names in result)
{
  dt2Entity obj = new dt2Entity();
  obj.name = names.name;
  db.InsertOnSubmit(obj);
  db.SubmitChanges();
}