我有两个数据库。它们都使用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方法,是否需要覆盖该实现才能使其正常工作?
答案 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发布