0

我使用这个 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 |用户名 |UserParentID |
|-----|-----------|---------|
|1 |管理员 |0 |
|2 |经销商1 |1 |
|3 |用户1 |1 |
|4 |经销商2 |2 |
|5 |用户2 |4 |
|6 |用户3 |5 |
|--------------------------------------|

如果我想使用上面的 sql 命令获取 reseler1 的所有子项,我将 @UserID 更改为 2,我的结果是:

|--------------------------------------|
|ID |用户名 |UserParentID |
|-----|-----------|---------|
|2 |经销商1 |1 |
|3 |用户1 |1 |
|4 |经销商2 |2 |
|5 |用户2 |4 |
|6 |用户3 |5 |
|--------------------------------------|

现在我需要这个sql命令的实体模型,我在谷歌上搜索它,我在stackoverflow(查询子实体)中找到了一些东西,比如下代码,但不能正常工作,只能得到一个级别的孩子:

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;
4

1 回答 1

0

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

于 2013-01-18T09:28:19.477 回答