2012-12-08 71 views
1

層次結構數據庫選擇通過Lambda表達式 你好我的表結構是遞歸的層次結構數據庫選擇通過Lambda表達式

ID

PARENTID

UserGROUPNAME

enter image description here

如何能我通過Lambda Express選擇了我的競賽中的子集ID離子這樣

enter image description here

我嘗試選擇第一

VAR鍵= db.UsersGroups.Select(X => X)。凡(U => u.GroupMasterID == 1).ToArray ();

var UsersGroup = db.UsersGroups.Where(x => keys.Contains(x.GroupMasterID));

但我認爲這是錯誤的返回或者返回只是2級數據

請幫我

+0

喬Celco對這個稱爲鄰接表模型的問題有一個有趣的解決方案。 http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html – dana

回答

0

最後我創建一個SQL函數

這樣

Create FUNCTION [dbo].[GET_USERGROUPLIST] 
(
    @GROUPID INT 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH UsersGroups_CTE AS (
SELECT * 
FROM [dbo].[UsersGroups] 
WHERE ID = @GROUPID 
UNION ALL 
SELECT e.ID, e.GroupName, e.ParentID ,e.Status 
FROM [dbo].[UsersGroups] e 
INNER JOIN UsersGroups_CTE ucte ON ucte.ID = e.ParentID 
) 
SELECT * 
FROM UsersGroups_CTE Where UsersGroups_CTE.Status = 1 
); 

,並在下一次使用在我的模型是這樣

db.GET_USERGROUPLIST(1); 

非常感謝lontivero他建議

0

That's的東西,你不能這樣做,沒有搞砸了,使用LINQ。你所要做的就是使用一個可能的common table expression來扁平化層次結構,然後你就可以編寫一個簡單的linq查詢。

+0

嗨lontivero ...我如何使用CTE在Lambda中,你可以給我看一個例子 – akaco

+0

使用CTE創建一個sql視圖就像文章一樣。然後針對該拼合視圖執行查詢。魔法並不在Linq中,而是在層次結構中變得平坦,就是這樣。 – lontivero