2013-04-10 48 views
0

我有一個家庭var foo = someUser.MyFamily();
每個用戶的用戶的列表中有類的列表public virtual List<Class> Classes {get; set;}
每個類都有日期public virtual List<Date> Dates {get; set;}
EF如何反轉對象層次

的列表要顯示什麼在這個本週的家庭,我想創建一個表

 
    date class people... 
      class people... 
    date+ class people 

所以我真正想要的是反轉這種安排,有
relevan名單牛逼日期,
其類的列表中的每個日期,
有用戶的(但只有用戶在家庭),列表中的每個類

我堅持搞清楚怎麼說的吧。我一直在想它應該是這樣的

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

埃裏克你可以有這種類型的'想'如果你有多對多(除了用戶 - 家庭) - 這是近似一對多(模型)。如果你有m-2-m,那麼最簡單的方法就是重新修改你的實體模型 - 以相反的方向引導關係。然後你可以有一個'本地'linq查詢w/o任何努力。提供您可以更改模型 – NSGaga 2013-04-10 00:35:43

+0

@NSGaga我明白您的觀點,實際上可以使用當前模型。 ClassTime - > Class - > UsersInClass的作品,但它給了我一個包含所有用戶的所有類的所有會議的巨大結果集。不知何故,我將不得不加入家庭成員名單。我想不出如何做到這一點。無論如何,似乎開始加入家庭成員會更快。 – 2013-04-10 01:15:41

回答

1

I got it !!!!!

感謝這篇文章,我學會了如何使用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 }