我有一个使用Distinct()的linq查询。如果我只是调用Distinct()而没有转换成一个列表,那么它不会返回一个不同的列表--它仍然包含重复的列表。
但是,如果我转换成一个列表,然后调用Distinct() -它可以像预期的那样工作,并且我只得到唯一的对象。
我使用Telerik,返回的对象是表示数据库中的一个表的类。
var uniqueUsers = (from u in Database.Users
select u).Distinct();上面的代码不会产生不同的结果,但是,当我转换为一个列表并调用distinct时,它会:
var uniqueUsers = (from u in Database.Users
select u).ToList().Distinct();我怀疑这与在转换为列表之前的集合有关,比较对对象的引用而不是对象数据本身,但我不完全理解发生了什么--为什么第一个代码示例没有产生唯一的结果,以及当使用.ToList()使其工作时集合发生了什么?
编辑我简化了上面的查询,在现实世界中,查询有几个连接,这会产生非唯一的结果,但是我只返回用户对象。
我尝试过重写Equals和GetHashCode方法,但是这并没有什么区别。
public override bool Equals(object obj)
{
User comparingObject = obj as User ;
if (comparingObject == null)
{
return false;
}
else
{
return comparingObject.UserID.Equals(this.UserID);
}
}
public override int GetHashCode()
{
return this.UserID.GetHashCode();
}UPDATE在LinqPad中运行了相同的查询,它的工作方式与预期的一样,提供了一个不同条目的列表。但是,在使用Telerik在LinqPad中运行相同的查询时,我会得到多个条目。因此,这似乎是Telerik的一个特点。当我有时间,我将进一步调查,并提出与电信的支持。
发布于 2013-07-01 10:17:41
显然,您的表中不能有完全重复的行(包括主键)。您的意思可能是一些相同字段的行(不包括主键)。
调用Distinct on IQueryable,在结果查询上生成一个SQL DISTINCT操作符,该操作符将表中的每个字段相互比较。因为表中不能有完全重复的行,所以它会返回所有行。
另一方面,在Distinct上调用List<User>将使用User对象的Equals方法来比较内存中的对象(在从数据库中获取所有行之后)。最后的结果取决于Equals方法的实现,该方法只能检查某些字段是否具有相同的值。
https://stackoverflow.com/questions/17401772
复制相似问题