如何在第三个数据表中获得存在于第一个数据表和不存在于第二个数据表的数据

本文关键字:数据表 存在 第一个 数据 第二个 不存在 三个 | 更新日期: 2023-09-27 18:05:10

Q:

我有两个查询,每个查询返回一个DataTable。我想返回另一个DaTaTable,作为(第一个数据表中存在什么,第二个数据表不存在(Not in((的结果。

我的问题:

编辑:我将其概括为:

1-DT1:

DataTable dt1 = cc1assiscrsevalDAL.GetAll(int.Parse(Session["course_prof"].ToString()), 0);

2-DT2:

DataTable dt2 = cc1assiscrsevalDAL.GetConfirmedEval(int.Parse(Session["course_prof"].ToString()));

注:batch_no、crsnum、elect_code为复合主键


最好的方法是什么?(明智的表现(。我也想和林克一起做这件事。(如果可能的话(。

如何在第三个数据表中获得存在于第一个数据表和不存在于第二个数据表的数据

var dt = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CustomDataRowEqualityComparer()).CopyToDataTable();
    public class CustomDataRowEqualityComparer: IEqualityComparer<DataRow>
        {
            public bool Equals(DataRow x, DataRow y)
            {
                return ((int)x["crsnum"]) == ((int)y["crsnum"])
                    && ((int)x["crsnum_e"]) == ((int)y["crsnum_e"])
                        && ((int)x["crstteng"]) == ((int)y["crstteng"]);
            }
            public int GetHashCode(DataRow obj)
            {
                return ((int)obj["crsnum"]) ^ ((int)obj["crsnum_e"]) ^ ((int)obj["crstteng"]) ;
            }
        }

linq中有一个名为Except的扩展方法,它解决了您的问题,但我们需要为我在上面的代码中所做的创建一个单独的类。

select * 
from (*target_query*) t
join
(
  select batch_no,crsnum,lect_code from (*target_query*) q
  except
  select batch_no,crsnum,lect_code from cc1assiscrseval
) temp on temp.batch_no = t.batch_no and temp.lect_code = t.lect_code, temp.crsnum = t.crsnum 

相当脏的解决方案,但我认为您可以通过只获得所需的batch_no、crsnum和lect_code来简化它,而无需执行两次第一个查询。但你必须自己想办法。

Linq为您提供了一个Except方法,因此您可以执行类似的操作

var _differences = dt1.AsEnumerable.Except(dt2.AsEnumerable()); // No checked or tested in VS

您还可以首先使用以下内容来获取相关列:

var x = From a In dt1
    Select (...relevant columns)
var y = From a In dt2
    Select (...relevant columns)

然后执行上述操作。

啊!