0

我有一个家庭中的var foo = someUser.MyFamily();
用户列表每个用户都有一个班级列表public virtual List<Class> Classes {get; set;}
每个班级都有一个日期列表public virtual List<Date> Dates {get; set;}

为了显示家庭本周的活动,我想创建一个表格

    约会班的人...
            班级人...
    约会+班级人

所以我真正想要的是颠倒这种安排并有
一个相关日期列表,
每个日期都有一个类列表,
每个类都有一个用户列表(但只有家庭中的用户)

我一直不知道该怎么说。我一直在想它应该是这样的

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

感谢您的洞察力。

4

1 回答 1

1

我知道了 !!!!!

感谢这篇文章,我学会了如何使用 SelectMany 来扁平化层次结构
http://blogs.interknowlogy.com/2008/10/10/use-linqs-selectmany-method-to-flatten-collections/

一旦我将它展平,就可以直接使用GroupBy()从日期 -> 会议 -> 用户重建对象层次结构,这样
每个日期都有一个会议列表
每个会议都有一个用户列表

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() 在列表中进行钻取。我不知道的是用于创建包含父对象的东西的愚蠢的 lambda 语法(parent, child) => new { parent child mix }

于 2013-04-10T03:36:44.213 回答