程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用Entity Framework Fluent语法或内联语法编写递归CTE大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用Entity Framework Fluent语法或内联语法编写递归CTE?

开发过程中遇到使用Entity Framework Fluent语法或内联语法编写递归CTE的问题如何解决?下面主要结合日常开发的经验,给出你关于使用Entity Framework Fluent语法或内联语法编写递归CTE的解决方法建议,希望对你解决使用Entity Framework Fluent语法或内联语法编写递归CTE有所启发或帮助;

AFAIK在liNQ和EF中均不支持递归CTE。解决方案是将CTE作为视图公开。有关使用EF Code First和Migrations进行递归或分层查询的文章,介绍了如何使用EF Code First迁移来部署这种视图。

尝试通过进行递归客户端迭代来模拟CTE并不能扩展到大型数据集,并导致与服务器之间的交流。请注意,您的EF代码是如何IEnumerable不返回的Iqueryable,这意味着它将实现每个级别,然后将每个条目的下一个级别串联为一个单独的请求 。基于liNQ的解决方案将适用于条目数有限的浅层次结构(并且请注意,许多项目 可以 具有这种数据布局,用户帖子/答案是典型示例),但是在具有许多元素的深层次结构中会崩溃。

解决方法

我对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)

  • 如图所示,这些递归查询很慢。并且使用Entity Framework进行此操作甚至更慢。但这是可以实现的。
  • 因此,可以通过在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

但是我试图理解代码却徒劳。有人可以给我关于在Entity Framework中编写递归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递归很棒吗

提前致谢

大佬总结

以上是大佬教程为你收集整理的使用Entity Framework Fluent语法或内联语法编写递归CTE全部内容,希望文章能够帮你解决使用Entity Framework Fluent语法或内联语法编写递归CTE所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。