2011-09-26 120 views
2

大家早上好,實體框架4:多對多關係IQueryable而不是ICollection

我想解決一個我首先遇到的EF代碼問題。我的模式是以下

public class Article : IUrlNode 
{ 
    [Key] 
    public Guid ArticleID { get; set; } 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateUpdated { get; set; } 
    public string Summary { get; set; } 
    [System.ComponentModel.DataAnnotations.InverseProperty("CategoryArticles")] 
    public virtual IQueryable<Category> ArticleCategories { get; set; } 

    public string FriendlyUrl 
    { 
     get; 
     set; 
    } 
} 
    [RouteChild("CategoryArticles")] 
    public class Category : ContentNode 
{ 
    public Guid ServiceId { get; set; } 

    [System.ComponentModel.DataAnnotations.InverseProperty("ArticleCategories")] 
    public virtual IQueryable<Article> CategoryArticles { get; set; } 
} 

我已經寫了與我能夠從數據庫中檢索類別,而不實際知道它的類別代碼。從那時起,我必須在不知道它的文章的情況下再次檢索該類別的單個文章。對於類別,我依賴於ContentNode基類和IUrlNode接口上的Articles。

分類檢索工作正常,並用一個單一的查詢,但之後我真正得到我不得不使用反射來獲取由RouteChild指向的導航屬性的種類屬性找到適合我的標準的單篇文章。問題是導航屬性類型爲ICollection的,這意味着它會在最佳使用延遲加載,並把所有從數據庫中的文章,並找到一個我在內存中尋找。

我的問題也正是在這以前的帖子(不是我)描述:

Entity Framework Code First IQueryable

有沒有辦法有一個導航財產的IQueryable或其他一些設計,可以繞過這個限制?

+0

你能創建一個新的可查詢呢?即使用文章ID從上下文開始新的查詢,您可以從中導航?希望這是有道理的... – Smudge202

回答

4

沒有沒有辦法有導航財產IQueryable,但你可以通過收集改爲IQueryable

IQueryable<Article> query = context.Entry(category).Collection(c => c.articles).Query(); 
query.Where(...).Load(); 

一般的「算法」看起來很奇怪。你想使用基類,但在同一時間你想訪問子屬性。這聽起來不對,它可能更好地解決(非「通用」的方式也更好)。

+0

我會看看你的建議。這一點的關鍵是能夠在不同類型的樹上有節點。一個類別就是這些類型之一。我打破樹並把文章放在它之外,因爲我期望有很多文章。 – John

+0

是的,效果很好!還發現ObjectContext.GetObjectType真的很有用。謝謝! – John