我有一个对象列表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
我怎样才能做到这一点?
答案 0 :(得分:2)
您可以使用SelectMany
:
var page = parents.SelectMany(p => p.Children)
.Skip(PageIndex * PageSize).Take(PageSize);
查看有效的fiddle here。
<强>更新强>
我做了一些研究,因为这对我也很感兴趣。使用以下假设:
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)
我假设Parent
和Child
都有一个公共属性(比如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);
如果您的Parent
和Child
都继承自同一个类或接口,那么可能会更酷。