2014-05-05 129 views
0

我有我的數據庫用戶訂閱的列表,每個訂閱具有類別,每個類別都有路徑的列表,每個路徑具有的文章列表?多重嵌套導航屬性EF?

型號

class User { 
    ICollection<Subscription> Subscriptions; 
} 
class Subscription { 
    Category category; 
} 
class Category { 
    ICollection<Path> paths; 
} 
class Path{ 
    ICollection<Article> Articles; 
} 

我的問題

如何檢索所有文章爲特定用戶?

回答

0

使用的SelectSelectMany語句的組合,您可以穿越你的實體,並找到你需要的集合:

var allUserArticles = myUser.Subscriptions 
    .Select(sub => sub.Category) //take the category from each subscription 
    .SelectMany(cat => cat.Paths) //Take each path from each category, put them in a single list 
    .SelectMany(path => path.Articles) //Take each article from each path, put them in a single list 
    .ToList(); 

需要注意的是,如果這些機構需要從數據庫中自動載入,即EF需要實現急切的加載,或者在運行上述語句之前,必須確保檢索所有需要的相關實體。意外的空值可能會導致您的輸出不正確。

但是,我沒有這方面的信息,因爲它從問題中缺失,所以我無法知道您的具體情況。

+0

沒有即時通訊不執行急切加載,我必須使用包括之前,這些選擇? db.Users.Include(「Subscriptions.Category.Paths.Articles」)。First()。訂閱 .Select(sub => sub.Category) .SelectMany(cat => cat.Paths) .SelectMany(path = > path.Articles) .ToList(); 另一個問題是,這些選擇在SQL服務器中運行,還是在內存中運行結果後運行? –

+0

是的。它不會像一條線那樣完成,但我認爲你已經把它作爲一個簡單的例子。一般來說,你會想使用Include來確保一切都被加載,然後使用上面的Select語句。 – Flater

+0

額外注意:不要擔心爲此使用多行,如果您要連接到數據庫,只有當您實際想要訪問實例時纔會運行查詢。在這種情況下,這意味着LINQ將在'ToList()'調用中運行已編譯的查詢,而不是在它之前。通常,查詢將在您第一次嘗試獲取某個Article對象時運行。 – Flater