2016-11-11 1 views
2

I Modell verfolgt haben, die Frage für die Buchung und die Antworten auf die FrageLinq to SQL-Abfrage mit Eltern-Kind-Beziehung

Modell

public partial class LMS_Question 
{ 
    [Key] 
    public int ClassDiscussionID { get; set; } 
    public int? ParentClassDiscussionID { get; set; } 
    public string Discussion { get; set; } 
    public string DiscussionTitle { get; set; } 
} 

Wenn Benutzer neue Frage veröffentlichen die ‚ParentClassDiscussionID‘ sein wird, null und wenn eine Antwort zu der Frage hinzugefügt wurde, wird 'ClassDiscussionID' auf 'ParentClassDiscussionID' aktualisiert.

Grundsätzlich haben die Spalten ClassDiscussionID und ParentClassDiscussionID eine Parent-Child-Beziehung.

Allerdings habe ich die Daten wie DiscussionTitle, ReplyCount zeigen wollen, wie

DiscussionTitle ReplyCount 
------------------------- 
Question1 2 Reponses 
Question2 3 Reponses 
Question3 5 Reponses 

folgt Also, wie kann ich dies mit LINQ to SQL-Abfrage erreichen?

Danke für die Hilfe!

Antwort

1

Zunächst einmal müssen Sie Ihr Modell so etwas wie dieses

public partial class LMS_ClassDiscussion 
    { 
     public LMS_ClassDiscussion() 
     { 
      LMS_ClassDiscussionchild = new List<LMS_ClassDiscussion>(); 
     } 
     public int ClassDiscussionID { get; set; } 
     public int? ParentClassDiscussionID { get; set; } 
     public string Discussion { get; set; } 
     public string DiscussionTitle { get; set; } 
     public LMS_ClassDiscussion _LMS_ClassDiscussion { get; set; } 
     public List<LMS_ClassDiscussion> LMS_ClassDiscussionchild { get; set; } 
    } 

dann Methode, die Sie ändern müssen alle Kinder von Eltern

var LMS_ClassDiscussions = GetChildren(query, null); 
    foreach (var item in LMS_ClassDiscussions) 
     { 
      Console.WriteLine(item._LMS_ClassDiscussion.ClassDiscussionID + "="+item.LMS_ClassDiscussionchild.Count); 
     } 
auf diese Weise

public List<LMS_ClassDiscussion> GetChildren(IList<LMS_ClassDiscussion> source, int? parentId) 
     { 
      var children = source.Where(x => x.ParentClassDiscussionID == parentId).ToList(); 
      //GetChildren is called recursively again for every child found 
      //and this process repeats until no childs are found for given node, 
      //in which case an empty list is returned 
      children.ForEach(x => x.LMS_ClassDiscussionchild = GetChildren(source, x._LMS_ClassDiscussion.ClassDiscussionID)); 
      return children.ToList(); 

     } 

Call-Methode zu erhalten