我将在页面上呈现如下图所示的对象图:
该类别具有IList<模块>并且该模块包含IList< Product> 现在我需要在这个结构上实现分页,但问题是我不能做Category.Skip(page * pageSize).Take(pageSize)因为这只能用于Category对象而不是整个对象树。换句话说,当类别,模块和产品的总和等于PageSize
时,我喜欢渲染/埃里克
答案 0 :(得分:1)
首先我要注意,这将导致可怕的UI,因为第二页将显示树的随机切片。您可以先从数据库中获取所有元组{Module,CountOfProducts}(创建一个索引视图,以便性能非常出色)。然后你可以走那棵树,尽可能地向前跳。该框架没有内置的必要组件,但TakeWhile可能会有所帮助。不幸的是,这个问题只有很长或不完整(如我的)答案。希望能让你上路。
答案 1 :(得分:0)
创建这样的东西:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Category
{
public IList<Module> Modules {get; private set;}
public IEnumerable<Module> AggregatedModules
{
get
{
foreach (var p in Modules)
{
yield return p;
}
}
}
public IEnumerable<Product> AggregatedProducts
{
get
{
foreach (var m in Modules)
{
foreach (var p in m.Products)
{
yield return p;
}
}
}
}
}
class Module
{
public IList<Product> Products {get; private set;}
public IEnumerable<Product> AggregatedProducts
{
get
{
foreach (var p in Products)
{
yield return p;
}
}
}
}
class Product
{
}
class Test
{
public void Test1()
{
Category c = new Category();
c.AggregatedProducts.Take(4).Skip(12);
IList<Category> cs = new List<Category>();
cs.EnumerablePropertyUnion(cat => cat.AggregatedProducts);
}
}
}
public static class EnumerableExtension
{
public static IEnumerable<T2> EnumerablePropertyUnion<T,T2>(
this IEnumerable<T> enumerable,
Func<T, IEnumerable<T2>> propertyEnumerator
)
{
foreach (var item in enumerable)
{
foreach (var subitem in propertyEnumerator(item))
{
yield return subitem;
}
}
}
}