gpt4 book ai didi

c# - IQueryable.Distinct() 与 List.Distinct()

转载 作者:太空狗 更新时间:2023-10-30 00:25:23 60 4
gpt4 key购买 nike

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

但是,如果我转换为 List 并然后调用 Distinct() - 它按预期工作并且我只得到唯一的对象。

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

var uniqueUsers = (from u in Database.Users 
select u).Distinct();

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

var uniqueUsers = (from u in Database.Users 
select u).ToList().Distinct();

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

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

我尝试覆盖 EqualsGetHashCode 方法,但这没有任何区别。

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();
}

[更新]在 LinqPad 中运行相同的查询后,它会按预期工作,提供不同条目的列表。但是,在使用 Telerik ORM dll 时在 LinqPad 中运行相同的查询,我得到多个条目。所以它似乎是 Telerik 的一个特点。当我有时间时,我会进一步调查并在 Telerik 支持下提出它。

最佳答案

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

调用 DistinctIQueryable , 生成 SQL DISTINCT结果查询上的运算符,它将表的每个字段相互比较。因为表中不能有完全重复的行,所以它会返回所有行。

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

关于c# - IQueryable.Distinct() 与 List.Distinct(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401772/

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