我有一个家庭用户列表var foo = someUser.MyFamily();
每个用户都有一个类public virtual List<Class> Classes {get; set;}
的列表
每个班级都有一个日期列表public virtual List<Date> Dates {get; set;}
为了显示本周家庭的内容,我想创建一个表
date class people... class people... date+ class people
所以我真正想要的是颠倒这种安排并且有
相关日期清单,
每个日期都有一个类列表,
每个类都有一个用户列表(但只有该系列中的用户)
我很难搞清楚如何说出来。我一直认为它应该是这样的
var foo = Users x Classes x Dates as in a join
.GroupBy(x => x.Date)
.Select(x => new { something })
.GroupBy(x => x.Class)
.Select(x => new { something })
etc...
并最终能够说出
foreach (var d in foo)
{
use d.Date
foreach (var c in d.Classes)
{
use c.Class.ClassTime, c.Class.ClassName
foreach (var u in c.Users)
{
use u.FirstName
感谢您的见解。
答案 0 :(得分:1)
我认真了!!!!!
感谢这篇文章,我学习了如何使用SelectMany来展平层次结构http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/;
一旦我将其展平,就可以直接使用GroupBy()
从日期重建对象层次结构 - &gt;会议 - &gt;用户如此
每个日期都有一个会议清单
每个会议都有一个用户列表
var meetingDates = Model.User.MyFamily(true)
.SelectMany(x => x.ClassesIamIn)
.SelectMany(x => x.Class.ClassMeetings, (c, d) => new { Date = d.Date, Meeting = d, c.User })
.GroupBy(x => x.Date)
.Select(x => new
{
Date = x.Key,
Meetings = x.Select(y => new { Meeting = y.Meeting, User = y.User })
.GroupBy(a => a.Meeting)
.Select(a => new
{
Meeting = a.Key,
Users = a.Select(b => b.User)
.OrderBy(d => d.FirstName)
})
.OrderBy(c => c.Meeting.TimeStart.TimeOfDay)
});
哇,这是一场斗争;哇真是一种解脱。上面的文章是关键。我已经知道如何使用SelectMany()来钻取内部列表。我不知道的是用于创建包含父对象的(parent, child) => new { parent child mix }
的愚蠢lambda语法