Проблема здесь в том, что Linq не знает, что вы хотите сравнить Name
. Вместо этого он делает то же, что и для всех типов объектов, сравнивает хеш, который отличается для двух разных экземпляров.
Что вам нужно сделать, так это указать методу Union, как сравнивать два элемента. Вы можете сделать это, создав пользовательский IEqualityComparer
, который сравнивает две строки данных так, как вы этого хотите.
Вот пример реализации:
class CustomComparer : IEqualityComparer<DataRow>
{
#region IEqualityComparer<DataRow> Members
public bool Equals(DataRow x, DataRow y)
{
return ((string)x["Name"]).Equals((string)y["Name"]);
}
public int GetHashCode(DataRow obj)
{
return ((string)obj["Name"]).GetHashCode();
}
#endregion
}
При вызове Union
вам нужно передать экземпляр этого компаратора:
var comparer = new CustomComparer();
DataTable dtUnion = dt1.AsEnumerable()
.Union(dt2.AsEnumerable(), comparer).CopyToDataTable<DataRow>();
Смотрите здесь для получения дополнительной информации:
http://msdn.microsoft.com/en-us/library/bb358407.aspx
Слово совета:
Linq лучше всего подходит для пользовательских классов данных, а DataRow
нет. Лучше иметь фактическое свойство Name в классе, только тогда Linq может действительно сиять.
Если вам не нужна гибкость динамической схемы, вам следует держаться подальше от DataTable
и реализовывать пользовательские классы, которые точно соответствуют вашим потребностям, поскольку DataTable
чрезвычайно раздутый и медленный.