Ef Core:ToHashSetAsync()

6

我注意到 Microsoft.EntityFrameworkCore Linq 扩展方法中没有 ToHashSet 的 异步 版本,我假设合适和安全的方式是使用 HashSet 来实现对象的材料化以防止重复,我是否错过了什么?如果这么重要为什么没有它的异步版本呢?


1
这是一个错误的假设。你是否为每个模型实体重写了EqualsGetHashCode方法?我认为并没有。如果您有重复值,很可能是由于编写不良的LINQ查询而导致的。 - Svyatoslav Danyliv
1
如果您的查询结果有重复,那么要么查询格式不正确,要么数据库中真的存在重复实体。无论哪种情况,都应该解决问题本身,而不是它的症状。 - MindSwipe
随意使用 ToList().ToHashSet() 来了解原因(它并不像你想象的那么有用)。 - Caius Jard
如果我正在向集合中添加重复的实体,那该怎么办?不添加它岂不是更好? - Alphas Supremum
2
我对所有这些评论和主要答案感到困惑。列表是表示集合的一种方式。它有一个特定的实现,使得迭代变得容易,仅此而已。而哈希集则具有隐含的契约:无重复项。即使我的数据库查询按设计返回唯一项,我也希望C#(以及我的代码使用者)能够保证没有重复项。如果我告诉Linq首先将结果转换为列表(异步),然后再从中构建哈希集,那么我所知道的是它可能会更加昂贵--我不应该看实现! - jeancallisti
显示剩余3条评论
1个回答

1
在代码中,您的表格被表示为DbSet,它是一个IListSource。
IListSource只有一个方法:
IList GetList();

所以,从EntityFrameworkCore返回的所有内容都是一个IList;一个可索引的、非唯一的值集合。而HashSet由于访问速度更快,是一个唯一的、非索引的值集合。相等比较决定了它的唯一性,而超过几列的任何内容开始计算起来都变得非常昂贵。

虽然你可能认为直接使用HashSet会更高效,但如果需要的话,数据已经是一个列表。ToListAsync()只是称呼玫瑰为玫瑰,并加载数据。然后,如果需要,可以将其转换为HashSet。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接