Сравните два DataTables, используя LINQ - PullRequest
1 голос
/ 25 июля 2011

У меня есть две базы данных.Они оба заполняются в DataTables с использованием функций GetTable1 \ GetTable2.

Я просто хочу сравнить таблицы данных с помощью 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 строка отличается между двумя базами данных.

Я использую метод Equals по умолчанию из Object, нужно ли переопределить эту реализацию, чтобы заставить это работать?

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Это связано с тем, как сравниваются строки. Их значения не сравниваются, их ссылки равны.

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
    */
0 голосов
/ 25 июля 2011

Даже если они могут иметь одинаковые столбцы, одна строка данных из таблицы1 не соответствует строке из таблицы2. Таким образом, row_of_table1! = Row_of_table2 всегда имеет значение true. Вы должны предоставить дополнительную информацию для их сравнения (возможно, с идентификатором, уникальным для обеих таблиц). Один из подходов, который вы могли бы использовать в качестве отправной точки, описан в ответе здесь.

Причина, по которой они не совпадают, уже опубликована Nate Zaugg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...