如何比较来自两个不同上下文的两个对象

本文关键字:两个 上下文 对象 何比较 比较 | 更新日期: 2023-09-27 18:32:13

我的应用程序上下文中有两个,它们在原理图和结构上是相等的,一个在远程服务器上,另一个是安装在计算机上的本地服务器。假设两个数据库相同但数据不同,我尝试做的是从两个上下文中获取所有数据进行比较,因此我可以在两个数据库中拥有相同的数据。使用非重复扩展方法的工作方式不同。我的类称为用户,其属性是:ID,名称,姓氏,用户,密码。ID 字段为"身份不为空"。现在我在两个数据库中只有相同的记录,因此,使用 Distinct 不应该返回数据,但我返回了它们。我用GetHashCode方法检查了哈希,这些是不同的。这是我的代码:

    foreach (var item in remote.Users)
            lstUsers.Add(item);
    foreach (var item in local.Users)
            lstUsers.Add(item);
    var results = lstUsers.Distinct().ToList();

如何比较来自两个不同上下文的两个对象

你不能使用 GetHashCode() 的默认实现来判断两个对象是否具有相同的字段值。如果它们是不同的对象实例(它们是),GetHashCode() 将为每个对象返回不同的值。

在任何情况下,由于每个数据库都有一个标识非空的 ID,因此对于在其他方面相同的对象,该 ID 可能会有所不同。

有几个选项,其中一些可能更好或更弱,具体取决于您的确切需求

  • 使用 UNIQUEID (GUID) 而不是整数 ID,并将其用于比较。
  • 向每条记录添加独立于 ID 的唯一标识符,并将其用于比较。
  • 实现 IEquatable。

我会对覆盖 GetHashCode() 和 Equals() 持谨慎态度。

您可以创建自己的业务对象类来保存用户信息。您的 lstUsers 将是此业务对象的列表,而不是数据库/EF 类型的列表。在此业务对象中,您可以覆盖 Equals 和 GetHashCode,以便在考虑 2 个用户对象是否相同时仅比较您关心的信息。

private Business.User Transform(User user)
{
    return new Business.User()
    {
        .Username = user.Username,
        .Name = user.Name
    }; //Etc; copy all fields you care about into your business object.
}
foreach (var item in remote.Users)
        lstUsers.Add(this.Transform(item));
foreach (var item in local.Users)
        lstUsers.Add(this.Transform(item));
var results = lstUsers.Distinct().ToList();