此处的关键字为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上的重复项?
答案 0 :(得分:0)
我认为无法避免扫描所有元素。在任何情况下,使用SQL查找副本的过程如下所示:
SELECT
name, COUNT(*)
FROM
MyType
GROUP BY
name
HAVING
COUNT(*) > 1
尝试以这种方式寻求解决方案可能值得吗?: Linq with group by having count