使用LINQ比较两个DataTable

时间:2011-07-25 19:41:38

标签: linq list compare using datatables

我有两个数据库。它们都使用GetTable1 \ GetTable2函数填充到DataTables中。

我要做的是基本上使用LINQ比较数据表。

我试过了:

var infoQuery =
                    (from db1 in GetTable1().AsEnumerable()
                     select db1).Except                            
                            (from db2 in GetTable2().AsEnumerable()
                             select db2);

还尝试过: (看起来应该和上面一样):

var results = GetTable1().AsEnumerable().Except(GetTable2().AsEnumerable());

我得到的结果是一张表中的所有记录。我正在寻找1的返回,因为两个数据库之间的1行是不同的。

我使用Object的默认Equals方法,是否需要覆盖该实现才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

它与行的比较方式有关。他们的价值观没有与他们的参考文献进行比较。

http://msdn.microsoft.com/en-us/library/bb300779.aspx

  

要比较自定义数据类型,请实现IEquatable泛型接口,并为该类型提供自己的GetHashCode和Equals方法。默认的相等比较器Default用于比较实现IEquatable的类型的值。

来自MSDN的示例:

public class Product : IEquatable<Product>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(Product other)
    {

        //Check whether the compared object is null.
        if (Object.ReferenceEquals(other, null)) return false;

        //Check whether the compared object references the same data.
        if (Object.ReferenceEquals(this, other)) return true;

        //Check whether the products' properties are equal.
        return Code.Equals(other.Code) && Name.Equals(other.Name);
    }

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.

    public override int GetHashCode()
    {

        //Get hash code for the Name field if it is not null.
        int hashProductName = Name == null ? 0 : Name.GetHashCode();

        //Get hash code for the Code field.
        int hashProductCode = Code.GetHashCode();

        //Calculate the hash code for the product.
        return hashProductName ^ hashProductCode;
    }
}

...

    Product[] fruits1 = { new Product { Name = "apple", Code = 9 }, 
                           new Product { Name = "orange", Code = 4 },
                            new Product { Name = "lemon", Code = 12 } };

    Product[] fruits2 = { new Product { Name = "apple", Code = 9 } };

    //Get all the elements from the first array
    //except for the elements from the second array.

    IEnumerable<Product> except =
        fruits1.Except(fruits2);

    foreach (var product in except)
        Console.WriteLine(product.Name + " " + product.Code);

    /*
      This code produces the following output:

      orange 4
      lemon 12
    */

答案 1 :(得分:0)

即使它们可能具有相同的列,但table1中的单个数据行与table2中的行不匹配。所以row_of_table1!= row_of_table2总是如此。您必须提供其他信息以进行比较(可能使用两个表唯一的标识符)。您可以使用一种方法作为起点,在an answer这里描述。

他们不匹配的原因已由Nate Zaugg发布