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