如何通过实体命令获取所有子项?

时间:2013-01-17 16:06:17

标签: sql-server entity-framework linq-to-entities entity-framework-4.1 entity

我使用这个SQL命令来获取子用户的所有孩子和孩子,我不知道如何用实体编写它?

WITH ParentUser AS (
SELECT  *, 1 AS nthLevel
FROM [OnlinePage].[dbo].[Users] usr1
WHERE ID = @UserID
UNION ALL
SELECT  usr2.*,
nthLevel + 1 AS nthLevel
FROM ParentUser pu INNER JOIN
[OnlinePage].[dbo].[Users] usr2 ON pu.ID = usr2.UserParentID
)
SELECT * FROM ParentUser WHERE 1 < nthLevel

我的用户表是:

CREATE TABLE [dbo].[Users](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](50) NOT NULL,
[UserParentID] [int] NOT NULL
)

它是这样的:

|--------------------------------------|
|ID   |Username   |UserParentID        |
|-----|-----------|--------------------|
|1    |admin      |0                   |
|2    |reseler1   |1                   |
|3    |user1      |1                   |
|4    |reseler2   |2                   |
|5    |user2      |4                   |
|6    |user3      |5                   |
|--------------------------------------|

如果我想使用upper sql命令获取reseler1的所有子节点,我将@UserID改为2,结果是:

|--------------------------------------|
|ID   |Username   |UserParentID        |
|-----|-----------|--------------------|
|2    |reseler1   |1                   |
|3    |user1      |1                   |
|4    |reseler2   |2                   |
|5    |user2      |4                   |
|6    |user3      |5                   |
|--------------------------------------|

现在我需要这个sql命令的实体模型, 我在谷歌上搜索它,我在stackoverflow(Querying child entities)中找到了类似下行代码的东西,但没有正常工作,只得到一个级别的孩子:

var query = from m in dbSet.Where(x => x.ID == 1)
join s in dbSet
on m.ID equals s.UserParentID into masterSlaves
from ms in masterSlaves.DefaultIfEmpty()
select ms;

1 个答案:

答案 0 :(得分:0)

实体框架和Linq-to-entities不支持分层查询。您必须使用SQL查询并使用dbSet.SqlQuerydbContext.Database.SqlQuery进行调用。使用EF 5 / .NET 4.5和数据库第一种方法,您还可以创建包装查询并映射它的SQL函数(这样您就可以使用Linq-to-entities查询中的该函数),但这在早期版本和代码优先。