簡體   English   中英

自我加入不包括孩子(實體框架4.0)

[英]Self join not including children (entity framework 4.0)

我正在實體框架4.0中創建一種族譜。 我遇到了一個問題,即實體框架僅加載直接子級。 即使我指定了include它也不會加載孩子的孩子。

例如,這是我的查詢:

public IQueryable<TreeMember> GetTreeMembers(int userId)
        {
            return this.ObjectContext.TreeMembers.Include("RelatedTreeMembers").Where(u => u.UserId == userId && u.RelatedTreeMemberId == null);
        }

這將加載第一級的孩子。 但這並不會給孩子們的孩子帶來負擔。 如果我必須包括孩子中的孩子,我必須寫:-

public IQueryable<TreeMember> GetTreeMembers(int userId)
        {
            return this.ObjectContext.TreeMembers.Include("RelatedTreeMembers.RelatedTreeMembers").Where(u => u.UserId == userId && u.RelatedTreeMemberId == null);
        }

這很快變得令人沮喪,因為我不知道我應該寫此RelatedTreeMembers多少次,因為一棵家譜可以擴展到N級。 我如何解決這個問題? 如果我的問題不清楚,請告訴我。

提前致謝 :)

EF就是這樣工作的。 您想定義遞歸(分層)查詢,這對於在EF中快速加載是不可能的。 您始終准確地指定了要加載的導航屬性-顯然,在這種情況下,您不能這樣做,因為您不知道遞歸的深度。

我喜歡CTE建議使用@Magnus的想法,但我不會使用DB View。 我會使用存儲過程。 原因是您已經將實體TreeMember映射到表。 如果定義視圖,將無法將其映射到相同的實體類型。 您將需要新的實體進行查看。 如果使用存儲過程,則可以將其結果映射到已經存在的實體類型。

另一種方法是使用延遲加載。

使用遞歸CTE編寫視圖,然后與Linq一起使用。 http://msdn.microsoft.com/en-us/library/ms186243.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM