我是SQL和实体框架(ADO.NET实体映射)中的新递归.我正在进行评论管理,我有一个Comments表,表包含列NewsID, CommentID, ParentCommentID, IndentLevel, CreatedTime.
我正在尝试获取特定新闻项目的评论列表,其中所有评论都是根据父母和创建时间下的孩子排列的,如下所示:
CommentID | time | ParentCommentID
Guid1 | t1 | null
Guid4 | t4 | Guid1
Guid2 | t2 | null
Guid3 | t3 | Guid2
Run Code Online (Sandbox Code Playgroud)
必须优先考虑子父母关系,然后是创建时间.
到目前为止我所倾向的是(来自互联网资源和之前的stackoverflow Q/A)
SQL:
WITH cte_name ( column_name [,...n] )
AS
(
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
-- Statement using the CTE
SELECT *
FROM …Run Code Online (Sandbox Code Playgroud) 我在Sql Server中有这个查询,我需要在EntityFramework中使用,那么如何编写一个与此结果相同的EntityFramwork代码
WITH cte AS
(
SELECT *
FROM StockGroups
WHERE GroupParent ='Stationery'
UNION ALL
SELECT g.*
FROM StockGroups g
JOIN cte
ON g.GroupParent = cte.GroupName
)
SELECT *
FROM cte
Run Code Online (Sandbox Code Playgroud)
我不知道如何在EF中转换它,所以我尝试使用join.
from a in db.StockGroups
join b in db.StockGroups on new { GroupParent = a.GroupParent } equals new { GroupParent = b.GroupName }
where
b.GroupName == "Stationery"
select new {
a.GroupName,
a.GroupParent,
Column1 = b.GroupName,
Column2 = b.GroupParent
}
Run Code Online (Sandbox Code Playgroud)
但结果并不像CTE一样递归.
嘿,我这里有这段代码,与它斗争了好几个小时.这个sql语句的作用基本上是获取指定文件夹的所有子文件夹(@compositeId).
WITH auto_table (id, Name, ParentID) AS
(
SELECT
C.ID, C.Name, C.ParentID
FROM Composite_Table AS C
WHERE C.ID = @compositeId
UNION ALL
SELECT
C.ID, C.Name, C.ParentID
FROM Composite_Table AS C
INNER JOIN auto_table AS a_t ON C.ParentID = a_t.ID
)
SELECT * FROM auto_table
Run Code Online (Sandbox Code Playgroud)
此查询将返回如下内容:
现在我想将代码转换为linq.我知道它涉及某种形式的递归,但仍然因为with语句而停滞不前.救命?