2012-11-20 70 views
1

我有羣組的簡單樹結構和尋找一種方式來查詢這樣的事情作爲一個Web應用程序:在任何級別創建遞歸Linq到實體查詢? (像遞歸CTE)

  • 頂級父
  • 所有子組(孩子的兒童和等)
  • 所有父組(我的父,母等的母公司)

我使用MS SQL所以它不是一個大問題,寫的選擇,我需要在DB和保存他們作爲存儲過程。

但是有沒有辦法使用EntityToSql來創建這樣的查詢?

這裏是例如TSQL查詢我使用的:

DECLARE @userGroupId uniqueidentifier 
DECLARE @searchTerm nvarchar(20) 

SET @userGroupId = '00000000-0000-0000-0000-000000000000' 
Set @searchTerm = 'test' 

;WITH n(lvl,id,ParentUserGroupId,FullName) AS (
    SELECT 1,id,ParentUserGroupId,FullName FROM UserGroups where 
    id in (select UserGroupId 
    FROM Users WHERE login like '%'[email protected]+'%') 
    UNION ALL 
    SELECT n.lvl+1, nplus1.id,nplus1.ParentUserGroupId, nplus1.FullName 
    FROM UserGroups as nplus1,n WHERE n.ParentUserGroupId = nplus1.id 
) 
SELECT DIStinct id,FullName 
FROM n where ParentUserGroupId = @userGroupId OR 
((@userGroupId IS NULL OR @userGroupId = '00000000-0000-0000-0000-000000000000') 
AND ParentUserGroupId IS NULL) 

回答

1

不,你不能在ESQL或LINQ到實體創建這樣遞歸查詢。

您可以直接使用EF或ADO.NET調用存儲過程,或者如果您使用.NET 4.5,並且如果使用EDMX,則可以將查詢包裝在表值函數中,將函數導入到EDMX中並使用它在Linq-to-entities查詢中。

+0

是的,這是它現在在我們的項目中的方式。 仍然爲每個新案例創建新的表值函數或存儲過程要慢得多,並且看起來不錯(我寧願不在數據庫中保存任何邏輯,甚至查詢邏輯)。 遞歸查詢並不是非常罕見的情況,奇怪的是沒有辦法從實體創建這樣的查詢。 我真的希望有一些神奇的地方=) –