比较两个对象的值而不列出每一列

comparing two objects for values without listing every column

Web 服务导入数据并存储在业务逻辑中 Graph.AddressList。如果找到匹配项,请添加到 keepList。 问题是数据完全相同,但没有添加到保留列表中。例如,数据库中的记录中的 ENTITYKEY 被填充但不在 Xml 中,而没有写出数据库中的每一列以匹配 xmlRecord 中的每一列。有解决办法吗?

// Fetch List Of Addresses
List<Address> updateAddressList = DbContext.GraphAddressList.Where<Address>(p => p.PersonnelNo == action.PersonnelNo).ToList<Address>();

////IF ADDRESS EXISTS IN THE DB, BUT NOT IN THE XML FILE, REMOVE FROM DB
List<Address> keepList = new List<Address>();
foreach (Address recordInDB in updateAddressList)
{
    foreach (Address_0006 recordInXML in Graph.AddressList)
    {
        if (recordInDB == recordInXML)
        {                                                        
            keepList.Add(recordInDB);
        }
    }
}

List<Address> removeList = updateAddressList.Except(keepList).ToList();
foreach (Address record in removeList)
{                                           
    DbContext.AddressList.DeleteObject(record);
}

感谢您的回复,所以我真的需要创建一个 class

 public override bool Equals(object obj)
{
    var item = obj as RecommendationDTO;

    if (item == null)
    {
        return false;
    }

    return this.RecommendationId.Equals(item.RecommendationId);
}

public override int GetHashCode()
{
    return this.RecommendationId.GetHashCode();
}

recordInDBrecordInXML 是自定义对象,要检查它们是否相等,您必须:

  1. 为他们覆盖 EqualsGetHashCodeCorrect way to override Equals() and GetHashCode()
  2. 实施 IEqualityComparer: How to use the IEqualityComparer
  3. 制作一个你的 classes 实现 IEquatable<T> 其中 T 是另一个 class
  4. 的类型

这样做,对象将根据它们所具有的属性进行比较。目前 (x == y) 检查的是引用是否相等——作为两个不同的实例意味着 false。这样做之后,比较时你也应该使用 recordInDB.Equals(recordInXML)

实现之后你还可以重构一下:

var keepList = recordInDB.Where(record => Graph.AddressList.Contains(record));
var removeList = updateAddressList.Except(keepList).ToList();
foreach (Address record in removeList)
{                                           
    DbContext.AddressList.DeleteObject(record);
}

选择选项 3,然后在您的 Address_0006 中实施 IEquatable<Address>:

public class Address_0006 : IEquatable<Address>
{
    public bool Equals(Address other)
    {
        // Compare here that each of the relevant properties in this (Address_0006) 
        // equals the corresponding property in other (Address)
    }
}

您可以反思 AddressAddress_0006 类型的属性,并检查名称相同的属性是否包含相同的数据。但是反射比较慢,所以除非你有上百个属性而且它们经常变化,否则我建议手动写比较。