2013-01-24 56 views
-1

我有LINQ到SQL返回父行

Id (int) 
ParentId (int) 

我需要查詢的是涉及到彼此的ParentId = Id,然而所有行的表格式嵌套多次

我有點卡住如何解決這個問題,我可能會恢復到一個存儲過程,但我真的想在純LINQ to SQL中嘗試這個。

+0

道歉,這是我的意思是我有點卡住了。不知道該怎麼去解決這個問題。 – Dreamwalker

+0

你需要sql代碼嗎? – daryal

+0

如果我需要恢復到SQL,那麼我可以很好地管理該部分。更多的情況是它最好是在linq中。 – Dreamwalker

回答

3

我覺得你有2種選擇:

  • 你必須明確地獲取父母這會導致DB許多單獨的調用。我認爲這種體系結構(通過db的一次調用來遞歸地獲取自引用數據)在L2S或L2E中不受支持。

  • 在這些情況下,我傾向於使用我的db的本地功能(在這種情況下:CTE)。您可以使用自定義SQL查詢並使用db.ExecuteQuery<ReturnType>定義返回類型。如果你的SQL Server 2005+可以使用以下語法:

    var allGroups =
    db.ExecuteQuery(
    @"WITH n(Id, ParentId) AS
    (SELECT Id, ParentId
    FROM MyTable
    WHERE Id = {0}
    UNION ALL
    SELECT nplus1.Id, nplus1.ParentId
    FROM MyTable as nplus1, n
    WHERE n.ParentId = nplus1.Id)
    SELECT Id, ParentId FROM n",
    firstChildId).ToList();

這樣一來,你在一個調用獲取所有實體。檢查出How to do an upper recursive self-join in SQL Server?Simplest way to do a recursive self-join in SQL Server?

+1

我一直在尋找和嘗試的東西,就像你說的那樣,總是會導致對db的多次調用,這是不好的。我想我會恢復到像我所提到的一個過程,因爲我們在庫中肯定不需要SQL代碼,以防將來使用mysql/oracle(這很有可能)。我會接受你的答案,因爲你還提供了有關SQL的額外信息,並且例程將在linq中工作。 – Dreamwalker