GroupBy和where的LINQ表达式转换问题

yhqotfr8  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(132)

我试图获取数据库中所有拥有重复所有者的项目。我的第一个方法返回它们的计数,并且没有任何问题:

  1. public int GetUsersWithMultipleItemsCount()
  2. {
  3. return GetItemsSecureAsync().Result
  4. .Where(item => item.OwnerId != null)
  5. .GroupBy(item => item.OwnerId)
  6. .Count(grouping => grouping.Count() > 1);
  7. }

但实际获取它们列表的方法无法翻译:

  1. public IEnumerable<IGrouping<Guid?, ItemType>> GetItemsWithDuplicateOwners()
  2. {
  3. return GetItemsSecureAsync().Result
  4. .Where(item => item.OwnerId != null)
  5. .GroupBy(item => item.OwnerId)
  6. .Where(grouping => grouping.Count() > 1)
  7. .ToList();
  8. }

我怎样才能修改它,而不需要客户端评估?我宁愿不放慢我的应用程序,因为这样的微不足道的功能。
编辑:我认为解决方案有效,但现在它再次失败,尽管SelectMany子句。我为此创建了一个小的扩展函数:

  1. public static IQueryable<T> NonDistinct<T, TKey>(this IQueryable<T> source, Expression<Func<T, TKey>> keySelector)
  2. {
  3. return source.GroupBy(keySelector).Where(g => g.Count() > 1).SelectMany(r => r);
  4. }

EF Core7似乎存在与此相关的问题:https://github.com/dotnet/efcore/issues/28002

5sxhfpxr

5sxhfpxr1#

失败的原因是ToList()
先使用SelectMany()

  1. public IEnumerable<ItemType> GetItemsWithDuplicateOwners()
  2. {
  3. var duplicates = GetItemsSecureAsync().Result
  4. .Where(item => item.OwnerId != null)
  5. .GroupBy(item => item.OwnerId)
  6. .Where(grouping => grouping.Count() > 1);
  7. var query = duplicates.SelectMany(grouping => grouping);
  8. return query.ToList();
  9. }

相关问题