Estoy trabajando con .NET MVC que tiene un modelo que implementa la recursividad de la siguiente manera:
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; } }En explicación, cada Idea contiene diferentes Comentarios dentro de ella, y cada comentario también tiene varios Comentarios más pequeños que responden al anterior. Sin embargo, no tengo idea de cómo hacer recursividad para obtener respuestas para un comentario y una respuesta más pequeña para cada respuesta hasta la última en el controlador y también cómo mostrarlas a la vista. Siéntase libre de hacerme cualquier pregunta ya que mi explicación a veces no es clara.
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)); }Utilice este ciclo;
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); } }Agregue esta función;
public void RecursionGetComments(Comment comment){ comment.Replys = GetComments(comment.CommentId); foreach(var reply in comment.Replys){ RecursionGetComments(reply); } } Si los RecursionGetComments anteriores no se llenaron correctamente, es posible que deba usar la palabra clave ref que pasa la instancia actual de la clase (pasar por referencia);
public void RecursionGetComments(ref Comment comment){ comment.Replys = GetComments(comment.CommentId); foreach(var reply in comment.Replys){ RecursionGetComments(reply); } } También noté que en su modelo, está usando la palabra clave virtual .
Marco de entidad de señales Virtual que la propiedad de navegación se cargará automáticamente / carga diferida, ya que está cargando sus comentarios manualmente, puede eliminar eso.