El problema aquí es que LINQ no sabe que usted quiere comparar el Name
. En cambio, hace lo que hace para todos los tipos de objetos, compara el hash, que es diferente para dos instancias diferentes.
Lo que necesita todo lo que necesita es decirle al método de la Unión cómo comparar dos elementos. Puede hacerlo creando un IEqualityComparer
personalizado que compare dos filas de datos de la forma que desee.
Aquí está un ejemplo de implementación:
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
}
Al llamar Union
este caso es necesario pasar en una instancia de este comparador:
var comparer = new CustomComparer();
DataTable dtUnion = dt1.AsEnumerable()
.Union(dt2.AsEnumerable(), comparer).CopyToDataTable<DataRow>();
Ver aquí para más información:
http://msdn.microsoft.com/en-us/library/bb358407.aspx
Un consejo:
Linq es mejor con clases de datos personalizadas, que no es DataRow
. Lo mejor es tener una propiedad de Nombre real en la clase, solo entonces Linq realmente puede brillar.
Si no necesita la flexibilidad del esquema dinámico, debe mantenerse alejado de DataTable
e implementar clases personalizadas que se asemejen exactamente a lo que necesita, ya que DataTable
es extremadamente inflado y lento.