1

我有以下SQL表:如何針對遞歸查詢優化LINQ-to-SQL?

ObjectTable 
-------------------------------------------------- 
| ID  | Name   | Order | ParentID | 
| int PK | nvarchar(50) | int | int FK |  

ObjectTable.ParentID是一個不同的對象記錄的ID的關係可爲空場。 LINQ到SQL生成看起來像一個類:

public class DbObject{ 

     int ID { get; set; } 

     string Name { get; set; } 

     int Order { get; set; } 

     int? ParentID { get; set; } 

     DbObject Parent { get; set; } 

     EntitySet<DbObject> ChildObjects { get; set; } 

} 

當我打開一個DbObject情況下,我需要能夠以遞歸訪問的子對象,這樣我就可以將數據寫入到一個層次JSON對象。

  • 我會在每次通過DbObject.ChildObjects訪問元素時執行單獨的查詢嗎?由於數據庫事務處理時間最長,似乎這是加載遞歸層次結構的非常低效的方式。

  • 用LINQ-to-SQL和/或EF執行遞歸查詢的最佳做法是什麼?

  • LINQ-to-SQL與 Common Table Expressions集成嗎? 我發現Common Table Expression (CTE) in linq-to-sql?

+0

您是否有能力更改數據模型?如果沒有,那麼我認爲你需要走下你提到的其他問題中提到的sql字符串執行路徑。 –

+0

@chrissainty,我可以改變數據模型。你是說沒有適合分層數據模型的情況? – smartcaveman

+0

不是說這是不合適的。只是它不適用於標準的LINQ查詢。因此,您可以更改模型以使其成爲單個LINQ查詢,也可以執行sproc/text查詢。取決於你喜歡哪種方式。 –

回答

3
在我們的例子

我們創建存儲過程與CTE的,並把它們在L2S設計師和他們的工作就像任何其他表不同的是它們表現爲一種方法,而不是財產,我們有到目前爲止,沒有遇到任何問題。

+0

這是正確的答案。 Linq-to-sql或EF都不支持有效的遞歸查詢。爲此,使用CTE的原生SQL。 –