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

发布于 2024-11-29 01:09:22 字数 435 浏览 0 评论 0 原文

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

  • 第一个数据表:

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

DataTable dt2 = cc1roleDAL.GetSpecific(x);

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

  1. crs_name

  2. name

I have two DataTables. I want to get what exists in the first one but does not exist in the second one. I would like the results in another DataTable. I would like to use LINQ.

  • The First datatable:

DataTable dt1 = cc1roleDAL.GetAll(x, 0);
  • The second datatable:

DataTable dt2 = cc1roleDAL.GetSpecific(x);

Note: the column names I return from the the two datatables:

  1. crs_name

  2. name

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

预谋 2024-12-06 01:09:22

这将为您解决问题:

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();

This will do the trick for you:

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()));

or if you prefer query syntax:

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;

You can then put the results into a DataTable by using the CopyToDataTable function:

DataTable result = rowsOnlyInDt1.CopyToDataTable();
回忆凄美了谁 2024-12-06 01:09:22

您想要使用 Except 扩展。

以下是 MSDN 上 linq 的链接

从我从问题中得到的信息来看,类似的事情。

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")));

You want to use the Except extension.

Here is the link to the linq on MSDN.

From what I get from the question somthing like.

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")));
浪漫之都 2024-12-06 01:09:22

您好,希望这段代码对您有所帮助,如果我误解了,可以要求我编辑这篇文章

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();
}

HI there hope this code does help you and if i have misunderstood then can ask me to edit this post

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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文