gpt4 book ai didi

c# - 为什么 List(T).Contains 无法在 Entity Framework 对象列表中找到匹配项?

转载 作者:太空狗 更新时间:2023-10-30 01:26:43 24 4
gpt4 key购买 nike

我有两个从 Entity Framework 生成的“Customer”对象列表。我需要比较这两个列表,看看它们之间是否有任何差异,所以,自然地,我写了这样的东西:

    private static List<Customer> originalList;

public static bool TestForEQ(List<Customer> source, List<Customer> destination)
{

foreach(Customer cust in originalList) {
if( !currentList.Contains(cust) )
{
return false;
}
}

public static void CheckData()
{
var ctx = new CustomersEntities();

if(originalList == null)
{
originalList = ctx.Customers.ToList<Customer>();
}
else
{
bool equiv = testForEQ(originalList, ctx.Customers.ToList<Customer>());
originalList = ctx.Customers.ToList<Customer>()
}
}

CheckData 从线程中定期调用。

因此,当我第一次逐步执行它时,在生成 originalList 和 currentList 之间对数据库进行任何更改之前,我惊讶地发现列表中的两个初始对象不是 - 根据 Contains() - 等价并且上面的代码返回 false。

我已验证这两个对象的基本属性(Id、名称等)是等价的,并且 Contains() 没有将任何列表中的任何一对对象视为等价的,所以 ..

1) 谁能帮我找出两个明显相同的数据对象的哪些属性导致 Contains() 失败?

2) 有没有人知道 Entity Framework 上的任何事情,如果在不同时间从未触及的数据表中获取,这会导致两个生成的实体不相等?有某种时间戳吗?或者它们是否被视为引用?

最佳答案

因为,默认情况下,您正在检查引用相等性……而这是失败的。

为了确保获得预期的结果,您可以创建自定义比较器(通过实现 IEqualityComparer<T> )并将其提供给 Contains()方法。

例如,以下实现将根据客户的 Id 比较客户:

public class CustomerEqualityComparer : IEqualityComparer<Customer>
{
public bool Equals(Customer c1, Customer c2)
{
return c1.Id == c2.Id;
}

public int GetHashCode(Customer c)
{
return c.Id.GetHashCode();
}
}

然后你可以调用 Contains:

if(!currentList.Contains(cust, new CustomerEqualityComparer())
return false;

关于c# - 为什么 List(T).Contains 无法在 Entity Framework 对象列表中找到匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com