如何使用分页呈现对象树?

时间:2011-02-02 10:44:21

标签: c# .net linq

我将在页面上呈现如下图所示的对象图:

  • 第1类
    • 第1单元
      • 产品1
      • 产品2
      • 产品3
    • 第2单元
      • 产品4
  • 第2类
    • ...

该类别具有IList<模块>并且该模块包含IList< Product> 现在我需要在这个结构上实现分页,但问题是我不能做Category.Skip(page * pageSize).Take(pageSize)因为这只能用于Category对象而不是整个对象树。换句话说,当类别,模块和产品的总和等于PageSize

时,我喜欢渲染

/埃里克

2 个答案:

答案 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;
            }
        }
    }
}