我不熟悉 SQL 和实体框架(ADO.NET 实体映射)中的这种递归。我正在做一个评论管理,我有一个Comments
表格,表格包含列NewsID, CommentID, ParentCommentID, IndentLevel, CreatedTime
。
我正在尝试获取特定新闻项目的评论列表,其中所有评论都根据父项下的子项和创建时间排列,如下所示:
CommentID | time | ParentCommentID
Guid1 | t1 | null
Guid4 | t4 | Guid1
Guid2 | t2 | null
Guid3 | t3 | Guid2
必须优先考虑子父关系,然后是创建时间。
到目前为止我所了解的是(来自互联网资源和以前的 stackoverflow Q/A)
- 如图所示,这些递归查询很慢。并且使用实体框架执行此操作甚至更慢。但它可以实现。
- 因此,可以通过在 SQL Server 中创建存储过程并使用功能导入调用它来完成。另一件事是在实体框架中使用 Linq。
- 在 SQL Server 中,它以这种格式使用
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 cte_name
- 但在尝试这个之前,我想尝试一下 Linq。
为此,我参考了这个我有想法的链接: https ://stackoverflow.com/a/6225373/892788
但我试图理解代码但徒劳无功。有人可以给我一个关于在实体框架中编写递归 CTE 的更好更详细的解释吗?
private IEnumerable<NewsComment> ArrangeComments(IEnumerable<NewsComment> commentsList, string parentNewsComntID, int level)
{
Guid parentNewsCommentID;
if (parentNewsComntID != null)
{
parentNewsCommentID = new Guid(parentNewsComntID);
}
else
parentNewsCommentID = Guid.Empty;
return commentsList.Where(x => x.ParentCommentID == parentNewsCommentID).SelectMany(x => new[] { x }.Concat(ArrangeComments(commentsList, x.NewsCommentID.ToString(), level + 1));
}
我在一个方法中使用它如下:
return ArrangeComments(commentList,null , 0);
我已经尝试过了,似乎我无处可去。尽管有关于 SQL 递归的解释,但 Linq 的示例较少,而且由于不太熟悉,对我来说也很模糊。有人可以帮我理解 Linq 中的这个 CTE 递归很棒吗
提前致谢