【问题标题】:Performance difference between GroupBy and MoreLinq's DistinctByGroupBy 和 MoreLinq 的 DistinctBy 之间的性能差异
【发布时间】:2017-09-05 09:50:00
【问题描述】:

阅读this 问题(和答案)我发现至少有两种方法可以从IQueryabe 中获取不同的项目,同时仍然可以选择过滤的内容。这两种方法是:

table.GroupBy(x => x.field).Select(x => x.FirstOrDefault());

或使用 MoreLinqs DistinctBy

table.DistinctBy(x => x.field);

但是该线程并没有解释性能差异以及我应该何时使用一个而不是另一个。那么我什么时候要使用其中一个呢?

【问题讨论】:

  • race your horses 请注意,MoreLinq 的 DistinctBy 在内存中工作,它不会被转换为 sql,也不会由 db 执行。 GroupyBy 可能由您的查询提供程序实现并在数据库上执行。

标签: c# .net linq morelinq


【解决方案1】:

他们所做的事情有很大的不同,因此性能差异是可以预料的。 GroupBy 将为原始集合中的每个键创建一个集合,然后将其传递给SelectDistinctBy 只需要保留一个哈希集,其中包含它之前遇到过密钥的天气,因此它可以更快。

如果DistinctBy 足以让您始终使用它,则仅在需要每个组中的元素时才使用GroupBy

对于 LINQ to EF,例如 DistinctBy 运算符也不起作用。

【讨论】:

  • 因此,如果我有一个 IQueryable 的 1000 个项目,其中只有两个是重复的 GroupBy 将创建一个集合 999 collection<OriginalItem>
  • 是的,将创建IGrouping<out TKey, out TElement>。但是你应该小心,IQueryable<T>,可能不会为实体框架实现DistincyBy 运算符,因此它会在运行时失败。此讨论适用于内存 LINQ。对于 EF,我看到的 DistinctBy 运算符实现实际上在底层使用 GroupBy 并且不会有任何性能差异(例如:stackoverflow.com/questions/32619338/…
  • DistinctBy 是第 3 方库
猜你喜欢
  • 2010-11-21
  • 2012-05-26
  • 2013-09-02
  • 2014-03-15
  • 2010-12-07
  • 2017-06-05
  • 2011-12-03
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多