0

我用這個SQL命令來獲取所有的孩子和孩子的孩子用戶,我不知道我怎麼能寫它與實體?我如何獲得所有childs行與實體命令?

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

,如果我想獲得reseler1的所有孩子的使用上SQL命令我改變@UserID與2和我的結果是:

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

現在我需要這個SQL命令的實體模型, 我尋找它在谷歌,我發現在計算器的東西(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

實體框架和Linq-to-entities不支持分層查詢。您必須使用您的SQL查詢並使用dbSet.SqlQuerydbContext.Database.SqlQuery來調用它。使用EF 5/.NET 4.5和數據庫優先方法,您還可以創建包含查詢的SQL函數並將其映射(因此您可以使用該功能從Linq到實體的查詢),但這不適用於先前的版本和代碼中。

+0

非常感謝,我該如何在實體中映射SQL函數的返回數據!?我創建了ADO.Net實體數據模型(Model1.edmx),當我在我的項目中工作時,我需要刪除它並重新創建它,並且如果我編輯model.tt - > users.cs實體類或創建新實體類,每一個重新創建我的模型,我應該編輯它,我如何創建模型的實體類外,什麼是映射返回SQL函數實體的最佳方式? –