使用IQueryable.GroupBy有效地查找集合是否包含重复项
本文关键字:是否 包含重 集合 查找 IQueryable GroupBy 有效地 使用 | 更新日期: 2023-09-27 18:15:17
这里的关键字是Queryable.GroupBy
而不是Enumerable.GroupBy
我使用EntityFramework,我想检查是否没有重复的值。在StackOverflow上有几个答案,比如这个,建议使用GroupBy
IQueryable<MyType> myItems = ...
IQueryable<IGrouping<string, MyType> groupsWithSameName = myItems
.GroupBy(myItem => myItem.Name);
// note: IQueryable!
bool containsDuplicates = groupsWithSameName.Any(group => group.Skip(1).Any());
虽然这在IEnumerables上是允许的,但在无序序列上不支持Skip。NotSupportedException建议在使用Skip之前使用OrberBy
。
作为另一种选择,我可以使用Count
检查是否存在包含多个元素的组bool containsDuplicates = groupsWithSameName.Any(group => group.Count() > 1);
两种方法都需要扫描集合中的所有元素。这是第二次,因为他们也被扫描分组。
是否有一种方法可以更有效地检查IQueryable副本?
我认为扫描所有元素是不可避免的。在任何情况下,使用SQL查找重复的过程将如下所示:
SELECT
name, COUNT(*)
FROM
MyType
GROUP BY
name
HAVING
COUNT(*) > 1
用这种方法寻求解决方案可能是值得的。: