比较linq对象的两个列表

本文关键字:两个 列表 linq 对象 比较 | 更新日期: 2023-09-27 18:07:05

我在wcf上有一个在线数据库和一个离线数据库。我想要同步它们,所以我开始将在线数据映射到离线数据的对象。

List<com.somee.wobservice.Customer> onlineCus = myservice.QueryCustomer();
List<Customer> offlineCus = dbc.Customers.ToList();
List<Customer> onlineCusMap = new List<Customer>();
foreach (com.somee.wobservice.Customer c in onlineCus)
{
     Customer cus = new Customer();
     cus.customer_id = c.customer_id;
     cus.customer_name = c.customer_name;
     cus.customer_email = c.customer_email;
     cus.password = c.password;
     cus.balance = c.balance;
     onlineCusMap.Add(cus);
 }

现在,我有两个Customer类的对象(数据库中的一个表)。但是当我比较从它们获得except时,它返回了脱机数据库的所有数据(假设没有数据,因为这些对象中的数据是相同的)

List<Customer> toInsert = offlineCus.Except(onlineCusMap).ToList();

有没有比较这两个对象的建议?

比较linq对象的两个列表

正如Jon在评论中指出的那样,为了使用Except,你需要覆盖Equals/GetHashCode,以确定客户的区别;默认情况下,比较器将通过引用,这在大多数情况下是不够的。

另一种替代方法是仅查询onlineCusMap列表中不存在的任何客户。我认为可以肯定的是,customer_id将是唯一的,足以区分客户

List<Customer> toInsert = 
    offlineCus.Where(x => !onlineCusMap.Any(y => y.customer_id == x.customer_id))
              .ToList();

如果你决定重写Equals,我建议你阅读指导方针,如何正确地这样做,因为它并不像看起来那么简单。