首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IQueryable.Distinct()与List.Distinct()

IQueryable.Distinct()与List.Distinct()
EN

Stack Overflow用户
提问于 2013-07-01 10:02:33
回答 1查看 7.9K关注 0票数 6

我有一个使用Distinct()的linq查询。如果我只是调用Distinct()而没有转换成一个列表,那么它不会返回一个不同的列表--它仍然包含重复的列表。

但是,如果我转换成一个列表,然后调用Distinct() -它可以像预期的那样工作,并且我只得到唯一的对象。

我使用Telerik,返回的对象是表示数据库中的一个表的类。

代码语言:javascript
复制
var uniqueUsers = (from u in Database.Users 
                   select u).Distinct();

上面的代码不会产生不同的结果,但是,当我转换为一个列表并调用distinct时,它会:

代码语言:javascript
复制
var uniqueUsers = (from u in Database.Users 
                   select u).ToList().Distinct();

我怀疑这与在转换为列表之前的集合有关,比较对对象的引用而不是对象数据本身,但我不完全理解发生了什么--为什么第一个代码示例没有产生唯一的结果,以及当使用.ToList()使其工作时集合发生了什么?

编辑我简化了上面的查询,在现实世界中,查询有几个连接,这会产生非唯一的结果,但是我只返回用户对象。

我尝试过重写EqualsGetHashCode方法,但是这并没有什么区别。

代码语言:javascript
复制
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的一个特点。当我有时间,我将进一步调查,并提出与电信的支持。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-01 10:17:41

显然,您的表中不能有完全重复的行(包括主键)。您的意思可能是一些相同字段的行(不包括主键)。

调用Distinct on IQueryable,在结果查询上生成一个SQL DISTINCT操作符,该操作符将表中的每个字段相互比较。因为表中不能有完全重复的行,所以它会返回所有行。

另一方面,在Distinct上调用List<User>将使用User对象的Equals方法来比较内存中的对象(在从数据库中获取所有行之后)。最后的结果取决于Equals方法的实现,该方法只能检查某些字段是否具有相同的值。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17401772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档