【问题标题】:How to detect that a datatable is a part of another datatable如何检测一个数据表是另一个数据表的一部分
【发布时间】:2012-06-18 14:00:51
【问题描述】:

如果我有两个数据表:

DT1 & DT2

如何检查第一个是否包含第二个,我的意思是DT2的相同行在DT1中。

【问题讨论】:

  • 所有行的字段是否必须与其他DataTable的相同(什么主键?)行的字段匹配?
  • 本帖与asp.net或linq无关。
  • 关心解释比较2个数据表中的数据与linq或asp.net有何关系?换一种方式。无论您是否使用 linq,或者 UI 是网页还是富客户端,您认为这种方法会改变吗?
  • 已经在下面的链接stackoverflow.com/questions/6833454/…中讨论过
  • @JasonMeckley:非常感谢,但是当我坚持使用linqasp.net 标签时,我有一个理由。请你看一下答案。

标签: c# asp.net .net linq datatable


【解决方案1】:

循环遍历表格和比较字段(希望只是 ID)。根据数据表的结构,有多种方法可以做到这一点。

【讨论】:

  • hmmmm ,但这太多了!
  • 如果你写问题的时间比你写问题的时间长,那你就错了!!
【解决方案2】:

我的问题:“所有行的字段都必须与另一个 DataTable 的同一行的字段匹配吗?”

你的答案:“不只是 id”

您可以先检查两个 DataTables 是否为 null 或两者是否具有相同的行数。然后,您可以使用 LINQ 使用Enumerable.Except 确定两者是否具有相同的 ID:

var dt1IDs = DT1.AsEnumerable().Select(r => r.Field<int>("id"));
var dt2IDs = DT2.AsEnumerable().Select(r => r.Field<int>("id"));
var diff = dt1IDs.Except(dt2IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !diff.Any();

解释:diff.Any() 在 DT1 中至少有一个 id 不在 DT2 中时返回 true。

编辑:如果 ID 不是唯一并且可能重复,您需要检查 DT1 中的所有 ID 是否也在 DT2 中,并且 DT2 的所有 ID 都在 DT1 中:

var DT1InDT2 = dt1IDs.Except(dt2IDs);
var DT2InDT1 = dt2IDs.Except(dt1IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !DT1InDT2.Any() && !DT2InDT1.Any();

无论如何,这个查询是有效的。


Edit2:我刚刚看到我有点误解了你的 requiremnet。您只想知道第一个表是否包含第二个,反之亦然。

var DT2IdNotInDT1 = dt2IDs.Except(dt1IDs);
var equal = !DT2IdNotInDT1.Any();

【讨论】:

  • 我尝试第一个 ids(200,300,146) 第二个 ids (200,300) 所以它应该返回 true 而不是 false 但它返回 false
  • 不,ID 是唯一的,但我应该只依赖 diff 吗?请检查上面的评论
  • @just_name:当然它返回 false,因为第一个表有 3 条记录,而第二个只有两条。
  • 那么我应该只依赖 diff,因为我的问题是检查第一个数据表是否包含整个第二个数据表
  • @just_name:我刚刚看到我有点误解了你的 requiremnet。您只想知道第一个表是否包含第二个,反之亦然。请稍等,我将编辑我的答案。
【解决方案3】:

你可以使用相交运算符

var intersect = DT2.AsEnumerable().Intersect(DT1.AsEnumerable(), DataRowComparer.Default);

【讨论】:

  • 你需要的不止一行,不是吗?
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2018-01-07
相关资源
最近更新 更多