如何使用列表< IGrouping<string,Product>> 正确创建分页?



我有一个查询,它通过 UniqueGroupId 对所有项目进行分组

result = ProductList1.Except(productlist3).Union(ProductList2).GroupBy(a => a.UniqueGroupId).OrderByDescending(a=>a.Key).ToList();

它返回一个List<IGrouping<string,Product>>

它工作正常,每个产品都正确分组,当它找到未设置 UniqueGroupId 的元素时,它会返回一个带有空键的巨型组,其中包含每个没有正确 UniqueGroupId 集的产品。

然后将此查询结果提供给显示内容的视图。

现在,由于结果越来越大,我想实现分页以更好地显示内容,其中每个组都计为页面的 1 个元素,除了具有 Key null 的组,在这种情况下,组的每个元素都应被视为 1 个元素。

我想使用 Skip and Take,但显然问题是,如果我 Skip(50( 也跳过 Key null 中包含的所有元素,这不是我想要实现的。

我该如何解决这个问题?谢谢

有点挑战性,但有可能。

您需要 (1( 按组合键分组,使非 nullUniqueGroupId生成正常分组,而 nullUniqueGroupId为每个元素生成单个元素分组,然后 (2( 对分组进行排序,(3( 应用分页,(4( 平展结果,(5( 仅按UniqueGroupId再次分组:

var result = ProductList1.Except(productlist3).Union(ProductList2)
.GroupBy(e => new { K1 = e.UniqueGroupId, K2 = e.UniqueGroupId == null ? e.Id : null }) // (1)
.OrderBy(g => g.Key.K1).ThenBy(g => g.Key.K2) // (2)
.Skip(...).Take(...) // 3
.SelectMany(g => g) // 4
.GroupBy(e => e.UniqueGroupId); // 5

你能对你的组进行一些重新排序吗?如果是这样,请考虑以下想法:将最大的组放在集合的末尾并重新计算skip计数。下面是示例:

var result = list.GroupBy(p => p.UniqueGroupId).ToList();
var ordered = result.OrderBy(g => g.Key != null ? 0 : 1);
if (skip < result.Count - 1)
return ordered.Skip(skip).Take(take);
return ordered.Last().Skip(skip - result.Count - 1)
.Take(take).GroupBy(p => p.UniqueGroupId);

最新更新