簡體   English   中英

如何用linq減去兩個數據表

[英]how to subtract two datatables with linq

有什么方法可以減去兩個數據表,以使第一個數據表的行不在第二個數據表中?

我已經嘗試過.Except()方法,如下所示,但它對我不起作用。

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

我認為我在使用此方法時有錯誤,但是我找不到?

您可以使用IEquailtyComparer創建自己的比較器

 public class CustomDataRowComparer : IEqualityComparer<DataRow>
    {
        public bool Equals(DataRow x, DataRow y)
        {
            for (int i = 0; i < x.Table.Columns.Count; i++)
            {
                if (x[i].ToString() != y[i].ToString())
                {
                    return false;
                }

            }
            return true;
        }

        public int GetHashCode(DataRow obj)
        {
            return obj.ToString().GetHashCode();
        }
    }

以后您可以這樣稱呼它:

CustomDataRowComparer myDRComparer = new CustomDataRowComparer();
var result2 = dt1.AsEnumerable().Except(dt2.AsEnumerable(),myDRComparer).CopyToDataTable();

因為引用不同,所以Except將不起作用。 內存中數據行的每個“副本”都是一個不同的對象,因此在“ Except中進行的相等比較將始終返回false。

您需要與類似的東西進行比較,例如行ID。 幾個想法如何做到這一點:

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

要么:

var rowsInFirstNotInSecond = dt1.Rows.Where(r1=>dt2.FindById(r1.ID) == null);

我使用以下代碼相互減去兩個數據表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM