比较两个对象的值而不列出每一列
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();
}
recordInDB
和 recordInXML
是自定义对象,要检查它们是否相等,您必须:
- 为他们覆盖
Equals
和 GetHashCode
:Correct way to override Equals() and GetHashCode()
- 实施
IEqualityComparer
: How to use the IEqualityComparer
- 制作一个你的 classes 实现
IEquatable<T>
其中 T
是另一个 class 的类型
这样做,对象将根据它们所具有的属性进行比较。目前 (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)
}
}
您可以反思 Address
和 Address_0006
类型的属性,并检查名称相同的属性是否包含相同的数据。但是反射比较慢,所以除非你有上百个属性而且它们经常变化,否则我建议手动写比较。
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();
}
recordInDB
和 recordInXML
是自定义对象,要检查它们是否相等,您必须:
- 为他们覆盖
Equals
和GetHashCode
:Correct way to override Equals() and GetHashCode() - 实施
IEqualityComparer
: How to use the IEqualityComparer - 制作一个你的 classes 实现
IEquatable<T>
其中T
是另一个 class 的类型
这样做,对象将根据它们所具有的属性进行比较。目前 (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)
}
}
您可以反思 Address
和 Address_0006
类型的属性,并检查名称相同的属性是否包含相同的数据。但是反射比较慢,所以除非你有上百个属性而且它们经常变化,否则我建议手动写比较。