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

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

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

public int GetUsersWithMultipleItemsCount()
{
    return GetItemsSecureAsync().Result
        .Where(item => item.OwnerId != null)
        .GroupBy(item => item.OwnerId)
        .Count(grouping => grouping.Count() > 1);
}

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

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

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

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

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

5sxhfpxr

5sxhfpxr1#

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

public IEnumerable<ItemType> GetItemsWithDuplicateOwners()
{
    var duplicates = GetItemsSecureAsync().Result
                     .Where(item => item.OwnerId != null)
                     .GroupBy(item => item.OwnerId)
                     .Where(grouping => grouping.Count() > 1);

    var query = duplicates.SelectMany(grouping => grouping);

    return query.ToList();
}

相关问题