EF如何反转对象层次结构

时间:2013-04-10 00:21:21

标签: asp.net-mvc-3 entity-framework

我有一个家庭用户列表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

感谢您的见解。

1 个答案:

答案 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语法