ASP.NET MVC 递归

ASP.NET MVC recursion

我正在使用具有如下模型实现递归的 .NET MVC:

    public class Comment
{
    [Key]
    [Required]
    public int CommentId { get; set; }

    [Required]
    public string Content { get; set; }
    public bool Anonymous { get; set; }
    [Required]
    public DateTime Created_date { get; set; }

    [Required]
    public DateTime Last_modified { get; set; }
    public virtual Comment Reply { get; set; }
    public virtual ICollection<Comment> Replys { get; set;}
    public virtual Idea Idea { get; set; }
}

在说明中,每个Idea里面都有不同的Comments,每个评论还有几个小的Comments回复前一个。但是,我不知道如何进行递归以获取评论的回复和每个回复的较小回复,直到控制器中的最后一个回复以及如何在视图中显示它们。有什么问题可以随时问我,有时我解释不清楚。

  public ActionResult Index(int? i)
    {
        List<Idea> Ideas = db.Ideas.ToList();
        foreach(Idea idea in Ideas)
        {
            idea.Comments = db.Comments.Include(x => x.Reply).ToList();
            idea.Comments=idea.Comments.Where(x => x.Idea == idea).ToList();
            foreach (Comment comment in idea.Comments)
            {
                comment.Replys = GetComments(comment.CommentId); //This function use to get list of reply for comment
                foreach (Comment reply in comment.Replys)
                {
                    reply.Replys=GetComments(reply.CommentId);
                    foreach (Comment reply2 in reply.Replys)
                    {
                        reply2.Replys=GetComments(reply2.CommentId);
                        foreach(Comment reply3 in reply2.Replys)
                        {
                            reply3.Replys = GetComments(reply3.CommentId);
                            //When would this stop ?
                        }
                    }
                }
            }
        }
        return View(Ideas.ToPagedList(i ?? 1, 5));
      
    }

使用这个循环;

foreach(Idea idea in Ideas)
{
    idea.Comments = db.Comments.Include(x => x.Reply).ToList();
    idea.Comments= idea.Comments.Where(x => x.Idea == idea).ToList();
    
    foreach (Comment comment in idea.Comments)
    {
        RecursionGetComments(comment);
    }
}

添加此功能;

public void RecursionGetComments(Comment comment){
    comment.Replys = GetComments(comment.CommentId);

    foreach(var reply in comment.Replys){
        RecursionGetComments(reply);
    }
}

如果上面的 RecursionGetComments 没有正确填写,您可能需要使用 ref 关键字来传递 class 的当前实例(通过引用传递);

public void RecursionGetComments(ref Comment comment){
    comment.Replys = GetComments(comment.CommentId);

    foreach(var reply in comment.Replys){
        RecursionGetComments(reply);
    }
}

我还注意到,在您的模型中,您使用了关键字 virtual

Virtual 信号 entity framework 导航 属性 将自动加载/延迟加载,因为您正在手动加载评论,您可以删除它。