2012-11-20 68 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

是的,这是它现在在我们的项目中的方式。 仍然为每个新案例创建新的表值函数或存储过程要慢得多,并且看起来不错(我宁愿不在数据库中保存任何逻辑,甚至查询逻辑)。 递归查询并不是非常罕见的情况,奇怪的是没有办法从实体创建这样的查询。 我真的希望有一些神奇的地方=) –