2013-03-04 161 views
3

我想知道從對象的嵌套層次結構中選擇的最佳方式是什麼? 假設我們如下一類MyRecursiveObject關於嵌套遞歸對象的查詢性能問題

public class MyRecursiveObject 
{ 
    public Int64 Id { get; set; } 
    public MyRecursiveObject Parent { get; set; } 
} 

我怎樣才能達到最大的性能而選擇MyRecursiveObject實例的所有父IDS?

任何建議,非常感謝。

+0

是否使用LINQ到SQL或LINQ到實體或只是什麼是最快的? – 2013-03-04 15:59:06

+0

如果您在數據庫派生數據和SQL Server 2008+上使用linq,那麼值得查看hierarchyid:http://msdn.microsoft.com/en-us/library/bb677290.aspx。 – Oliver 2013-03-04 16:00:54

+0

我正在尋找兩個實際!有時我們正在DAL中處理這個問題,有時在邏輯層中處理這個問題。 – 2013-03-04 16:01:23

回答

1

您可以使用簡單的循環,而不是遞歸的:

public IEnumerable<long> GetAllParentIdsOf(MyRecursiveObject obj) 
{ 
    MyRecursiveObject child = obj; 

    while (child.Parent != null) 
    { 
     child = child.Parent; 
     yield return child.Id; 
    } 
} 

樣品:

MyRecursiveObject obj = new MyRecursiveObject {  
    Id = 1, 
    Parent = new MyRecursiveObject { 
     Id = 2, 
     Parent = new MyRecursiveObject { Id = 3 } 
    } 
}; 

GetAllParentIdsOf(obj).ToList().ForEach(Console.WriteLine); 

// 2 
// 3 
1

LinqToSql不支持任意深度的步行樹木。您應該使用TSQL While循環編寫一個sql函數來生成結果,並從linqtosql調用該函數。

喜歡的東西:

DECLARE @MyNodeID int 
SET @MyNodeID = 42 
    -- we're looking for the path from this ID back up to the root 
    -- we don't know the length of the path. 

DECLARE @MyTable TABLE 
(
    int ID PRIMARY KEY, 
    int ParentID, 
) 

DECLARE @ID int 
DECLARE @ParentID int 

SELECT @ID = ID, @ParentId = ParentId 
FROM MyRecursiveObject 
WHERE ID = @MyNodeID 

WHILE @ID is not null 
BEGIN 

    INSERT INTO @MyTable (ID, ParentID) SELECT @ID, @ParentID 

    SET @ID = null 

    SELECT @ID = ID, @ParentId = ParentID 
    FROM MyRecursiveObject 
    WHERE ID = @ParentID 

END 

SELECT ID, ParentID FROM @MyTable --results