创建递归Linq到实体查询? (就像递归CTE一样)

时间:2012-11-20 06:06:46

标签: entity-framework recursion linq-to-entities

我有一个简单的用户组树结构的Web应用程序,并寻找一种方法来查询以下内容:

  • 顶级家长
  • 任何级别的所有儿童群体(孩子等的孩子)
  • 所有父母群组(我的父母,父母的父母等)

我正在使用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 '%'+@searchTerm+'%')
    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 个答案:

答案 0 :(得分:1)

否则您无法在ESQL或Linq-to-entities中创建此类递归查询。

您可以直接使用EF或ADO.NET调用存储过程,或者如果您使用的是.NET 4.5,并且如果您使用的是EDMX,则可以将查询包装在表值函数中,将函数导入EDMX并将其用于Linq-to-entities查询。