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

时间:2016-10-27 09:32:58

标签: c# linq

此处的关键字为Queryable.GroupBy,而非Enumerable.GroupBy

我使用EntityFramework,我想检查是否没有重复值。 StackOverflow like this one上的几个答案建议使用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上的重复项?

1 个答案:

答案 0 :(得分:0)

我认为无法避免扫描所有元素。在任何情况下,使用SQL查找副本的过程如下所示:

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

尝试以这种方式寻求解决方案可能值得吗?: Linq with group by having count