2016-02-06 67 views
0

一個孫子我有這樣的結構:獲取所有的父母,但只有一個兒子和一個條件

Topics.SubTopics.Events 
Topics.Users 
Users.Topics 

TopicsUsers是一個多一對多的關係。

我想檢索PremiereDateTimeInUtc(事件的屬性)爲equal or greater then yesterdayTopics.Users.Id == userId的所有主題,子主題和事件。但每個主題只能檢索1個事件(從昨天開始的第一個事件)。而且只有作爲事件父項的子專題。但主題必須全部歸還,即使是沒有主題和事件的主題。

我想這個至今:

return context.Topics 
.Include(
    t => t.SubTopics.Select(
     s => s.Events 
     .Any(e => e.PremiereDateTimeInUtc >= DateTime.Today.AddDays(-1)) 
    ) 
) 
.Where(t => t.Users.Any(u => u.Id == userId)).ToList(); 

但是,這是行不通的。我得到以下異常:「包含路徑表達式必須引用在該類型上定義的導航屬性。對於參考導航屬性使用虛線路徑,對集合導航屬性使用選擇運算符 參數名稱:path」。

+0

第一個問題:這不是什麼'Include'用於:它所做的就是列出使用初始查詢加載*列*的子表。它根本不參與LINQ過濾。 –

+0

@MikeEdenfield我應該看看/使用哪種方法呢? –

回答

1
var yesterday =DateTime.Today.AddDays(-1); 

var events = context.Events.Where(x=>x.PremiereDateTimeInUtc>=yesterday) 
    .GroupBy(x=>x.Subtopic.TopicId, (k,g)=>new{ 
     TopicId=k, 
     Event=g.OrderBy(e=>e.PremiereDateTimeInUtc).FirstOrDefault() 
    }); 

var topics = context.Topics 
    .Where(t=>t.Users.Any(u=>u.Id==userId)) 
    .GroupJoin(events, t=>t.Id, e=>e.TopicId,(t,g)=>new{ 
     Topic=t, 
     FirstEvent=g.FirstOrDefault(), 
     Subtopic=g.FirstOrDefault().Subtopic 
    }); 
+0

這可以通過一個實體框架查詢來完成嗎? –

+1

你對單個查詢有什麼意義?這實際上是一個單一的查詢。 「主題」是單個查詢,正在執行。爲了便於閱讀,我將「事件」部分分開,但不是單獨執行。枚舉主題時,這兩個查詢都會組合並執行。 – tede24

+0

哦,那麼...沒有得到那個。謝謝! –

相關問題