使用LINQ分页对象列表

时间:2014-07-21 12:34:13

标签: c# asp.net linq

我有一个对象列表List<Parent> Parents

Parent班级有List<Child> Children

到目前为止,我已使用LINQ:

将分页应用于Parents

List<Parent> PageX = Parents.Skip(PageIndex * PageSize).Take(PageSize);

例如,如果PageSize = 2,我有以下结果:

  

--------------- Page 1 ----------------------

     

家长1

     

儿童1

     

儿童2

     

3岁儿童

     

家长2

     

儿童1

     

儿童2

     

--------------- Page 2 ----------------------

     

家长3

     

儿童1

     

家长4

     

儿童1

     

儿童2

我想要实现的目标如下:

  

--------------- Page 1 ----------------------

     

家长1

     

儿童1

     

儿童2

     

--------------- Page 2 ----------------------

     

3岁儿童

     

家长2

     

儿童1

     

--------------- Page 3 ----------------------

     

儿童2

     

家长3

     

儿童1

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用SelectMany

var page = parents.SelectMany(p => p.Children)
               .Skip(PageIndex * PageSize).Take(PageSize);

查看有效的fiddle here

<强>更新
我做了一些研究,因为这对我也很感兴趣。使用以下假设:

  • 您正在使用EF
  • 您只有一个级别的此父级&gt;子级关系
  • 您的实体拥有Position属性

您应该可以对数据库执行以下操作,以便在一个查询中获取具有正确顺序的页面的项目&#34;:

var pageItems = db.Parents.SelectMany(p => p.Children).Include(c => c.Parent)
                    .OrderBy(c => c.Parent.Position).ThenBy(c => c.Position)
                    .Skip(PageIndex * PageSize).Take(PageSize);

我没有测试这段代码,因为我目前没有DB来测试它,所以请报告,如果你可以测试它,如果你的案例的答案是正确的。

答案 1 :(得分:1)

我假设ParentChild都有一个公共属性(比如Name),用于识别它们?

在这种情况下,您必须展平层次结构,以在同一列表级别包含父级和子级信息。

所以,假设像:

class Parent
{
    public string Name { get; set; }

    private readonly List<Child> _children = new List<Child>();
    public List<Child> Children
    {
        get { return _children; }
    }
}

class Child
{
    public string Name { get; set; }
}

您可以使用以下内容将其展平为单个IEnumerable<string>

var flattened = Parents
    .Select(p => new [] { p.Name }.Concat(p.Children.Select(c => c.Name)))
    .SelectMany(x => x);

然后你按照目前的方式对其进行分页:

var results = flattened.Skip(PageIndex * PageSize).Take(PageSize);
foreach (var x in results)
    Console.WriteLine(x);

如果您的ParentChild都继承自同一个类或接口,那么可能会更酷。