C# 如何使用linq减去两个数据表

C# 如何使用linq减去两个数据表,c#,linq,datatable,C#,Linq,Datatable,有没有办法减去两个数据表,使第一个数据表的行不在第二个数据表中 我尝试过下面这样的.Except()方法,但它对我不起作用 dt1.AsEnumerable().Except(dt2.AsEnumerable()).CopyToDataTable(); 我想我在使用这个方法时犯了错误,但我没有发现?,除了,因为引用不同,所以不起作用。内存中数据行的每个“副本”都是一个不同的对象,因此在中进行的相等性比较将始终返回false 您需要与类似的东西进行比较,比如行ID。如何做到这一点,有几个想法:

有没有办法减去两个数据表,使第一个数据表的行不在第二个数据表中

我尝试过下面这样的.Except()方法,但它对我不起作用

dt1.AsEnumerable().Except(dt2.AsEnumerable()).CopyToDataTable();

我想我在使用这个方法时犯了错误,但我没有发现?

,除了
,因为引用不同,所以不起作用。内存中数据行的每个“副本”都是一个不同的对象,因此在
中进行的相等性比较将始终返回false

您需要与类似的东西进行比较,比如行ID。如何做到这一点,有几个想法:

var rowsInFirstNotInSecond = dt1.Rows.Where(r1=>!dt2.Rows.Any(r2=>r1.ID == r2.ID)); 
或:


除外
将不起作用,因为引用不同。内存中数据行的每个“副本”都是一个不同的对象,因此在
中进行的相等性比较将始终返回false

您需要与类似的东西进行比较,比如行ID。如何做到这一点,有几个想法:

var rowsInFirstNotInSecond = dt1.Rows.Where(r1=>!dt2.Rows.Any(r2=>r1.ID == r2.ID)); 
或:


您可以使用创建自己的比较器


您可以使用创建自己的比较器


我使用以下代码将两个数据表相减:

var query =    
    from row1 in dt1    
    where !(from row2 in dt2    
            select row2.ID)    
           .Contains(row1.ID)    
    select row1;

这段代码返回的正是我想要的…

我使用以下代码将两个数据表相减:

var query =    
    from row1 in dt1    
    where !(from row2 in dt2    
            select row2.ID)    
           .Contains(row1.ID)    
    select row1;

此代码返回的正是我想要的…

此代码确实有效:

var rows =dtFirst.AsEnumerable().Except(dtSecond.AsEnumerable(), DataRowComparer.Default);
 DataTable result = null;
 if (rows.Count() != 0)
      result = rows.CopyToDataTable();

此代码确实有效:

var rows =dtFirst.AsEnumerable().Except(dtSecond.AsEnumerable(), DataRowComparer.Default);
 DataTable result = null;
 if (rows.Count() != 0)
      result = rows.CopyToDataTable();

你有钥匙吗?如果不是,两行什么时候相等?@Kobi,不,我没有键,但两个数据表都有相同的列,当然还有一些相同的行(我指的是一些具有相同值的行)。你有键吗?如果不是,两行何时相等?@Kobi,不,我没有键,但两个数据表都有相同的列,当然还有一些相同的行(我指的是具有相同值的一些行)。