在性能方面,我应该使用.ToList().Distinct()还是.Distinct().ToList()?
这两种扩展方法是否生成相同的SQL查询?
第二种方法似乎应该表现得更好,但这是真的吗?
使用一个比另一个有什么好处或缺点吗?
发布于 2020-03-09 09:25:22
那得看情况。如果是针对List<T>或Dictionary<K,V>执行的查询,则后者(Distinct().ToList())会更好。
原因是,如果您执行.ToList().Distinct(),Distinct()将返回一个IEnumerable,该IEnumerable必须再次执行才能获得真正的集合。本质上,您创建两个集合,但永远不会使用第一个集合。
但是,有一种情况是,.ToList().Distinct()可能更好,如果您正在使用对象到关系映射程序(请参阅: EntityFramework),并且希望从数据库表中获取所有行(可能是在后台填充缓存或在数据库中消耗更少的CPU ),然后在本地执行.Distinct()操作。
发布于 2020-03-09 09:18:53
简短回答: .Distinct().ToList()
解释:
ToList__ --它将IEnumerable<T>转换为List<T>,称为Immediate execution。因此,您应该首先过滤DB中的所有数据,而不是获取所有数据,然后在"client-side"中获取所有数据
发布于 2020-03-09 09:25:32
您提到的SQL表明,您的数据源是某种类型的DBContext。
在这种情况下,根据定义,一旦完成了.ToList(),所有可用数据都已转换为.NET内存中的对象。在此之后执行.Distinct()只能在.NET内存中运行--它将像没有数据库一样运行。
上面的SQL查询与.Distinct().ToList()的查询完全不同,这将让数据库执行不同的操作。
要实现最好的性能,最好的方法是.Distinct().ToList()。
https://stackoverflow.com/questions/60597529
复制相似问题