使用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副本?

使用IQueryable.GroupBy有效地查找集合是否包含重复项

我认为扫描所有元素是不可避免的。在任何情况下,使用SQL查找重复的过程将如下所示:

    SELECT
       name, COUNT(*)
    FROM
       MyType
    GROUP BY
       name
    HAVING 
       COUNT(*) > 1

用这种方法寻求解决方案可能是值得的。: