2010-05-30 67 views
3

我有一個模型,其中包括NODES和RELATIONSHIPS(通過parent_node,child_node排列將節點連接在一起)。如何在實體框架模型中編寫遞歸查詢?

Q1 - 在EF/Linq-to-entities中是否有任何方法在節點上執行查詢(例如context.Nodes ..)以查找圖中的「所有父母」或「或子女」?

Q2 - 如果Linq-to-entities中不存在其他方法,除了編寫手動方法並執行此操作外,是否還有其他方法可以執行此操作?

問題3 - 如果手動是唯一的方法,那麼我應該關心數據庫命中的數量,因爲方法會通過數據遞歸嗎?或者更具體地說,是否有任何EF緩存類型功能可以幫助確保該方法從「數據庫點擊次數」的角度來看性能?

感謝

感謝

回答

1

沒有這樣優雅的方式來flaten樹。 你可以(在存儲過程或實體框架中)創建一個循環,直到沒有變化發生,在這個迭代中,你將在一些臨時表或集合中綁定父和子的孩子。 最後你會有一個父母的收藏,sucsessor two-ples。

+0

感謝tsinik - 在這種情況下,你知道如果在EF的方式來有效地無法加載我的全部彙集在圖中的節點任何參數,直到它們被使用?即在屬性級別進行延遲加載?也就是說,如果我要被加載了大量的實體對象轉換成圖形,我想,至少只要只能用FK關係的核心實體是加載可能是從一個存儲立場 – Greg 2010-05-30 20:08:24

+0

像我知道的比較好,有在屬性級別上沒有延遲加載,但可以爲每個表映射多個實體,以便將節點實體拆分爲2並僅處理相關數據。 – tsinik 2010-05-31 11:05:19

1

當您使用Microsoft SQL Server 2005或更高版本時,可以使用CTE(Common Table Expressions)。它們允許你定義一個遞歸查詢。儘管SQL Server下的封面並不僅僅是爲你發射一堆查詢,它還是完全服務器端的,所以它可以避免你進行大量的客戶端 - 服務器通信。

您將不得不使用存儲的proc或普通的SQL查詢來執行此操作,因爲EF無法爲您執行此操作。