2017-10-20 2 views
1

Ich verwende VS2017, um eine ASP.NET-Webanwendung (ohne CORE) zu erstellen, .NET Framework ist 4.6.2 und das Entity Framework .NET ist 6.1. 3. Ich habe hier nach meiner Antwort gesucht, aber alles, was ich versucht oder erwähnt habe, steht mir nicht zur Verfügung.Mehrere Enkelkinder des Elternteils von Entity Framework .NET zurückgeben

Ich habe den folgenden Code Enkel von Kindern eines bestimmten Eltern jetzt zu erwerben, ich weiß, dass es eine effizientere Möglichkeit, diese Enkel des Erwerbs sein muss, kann aber nicht herausfinden, wie:

  using (_ge = new generation_entities()) 
     { 
      if (_id != null) 
      { 
       List<scheduleheader> _tlist = (from a in _ge.scheduleheaders.Include("scheduledetails") where a.programID == _id select a).ToList(); 
       foreach (scheduleheader _t in _tlist) 
       { 
        foreach (scheduledetail _s in _t.scheduledetails) 
        { 
         _s.scheddtlcustoms = (from a in _ge.scheddtlcustoms where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtlstandards = (from a in _ge.scheddtlstandards where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtltalks = (from a in _ge.scheddtltalks where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheddtlvenues = (from a in _ge.scheddtlvenues where a.dtlID == _s.dtlID select a).ToList(); 
         _s.scheduledtlrecurrences = (from a in _ge.scheduledtlrecurrences where a.dtlID == _s.dtlID select a).ToList(); 
        } 
       } 
       return _tlist; 
      } 
      else 
       return (from a in _ge.scheduleheaders where a.scheduledetails.Any(b => b.start > DateTime.Today.AddDays(-30)) && a.programID == null select a).ToList(); 
     } 

Ich habe versucht mit .ThenInclude und Include("xxxx.xxxx.xxxx") aber .ThenInclude ist nicht einmal für mich verfügbar und die Include("xxxx.xxxx.xxxx") funktioniert nur für ein Enkelkind. Die Include() erlaubt mir nur, einen String-Pfad einzugeben, und ich habe Kommentare gesehen, dass das OP eine ältere Version von EF verwendet.

Ich stecke darauf, kann ich erleuchtet werden, wenn ich hier etwas verpasse?

Antwort

1

Sie können Kette mehrere Include("xxxx.xxxx.xxxx") als spitze in einer anderen Antwort.

Dies wird jedoch die aktuelle parents.Count * children.Count * grandChildrenTypes.Count Anzahl von SQL-Abfragen durch einzelne, aber Monster-SQL-Abfrage, die alle Spalten und alle Datensätze in einem einzigen Ergebnissatz konsolidiert, die möglicherweise auch nicht effizient sein.

Ich würde vorschlagen, dass Ihnen einen hybriden Ansatz (ähnlich wie EF-Core verarbeitet die Include s), die 1 SQL pro Eltern ausgeführt wird, 1 pro Kind und 1 pro je Enkel Typ, das heißt in diesem Fall insgesamt 7 SQL-Abfragen Nur die übergeordnete Abfrageergebnis in Variable gespeichert wird, werden die Kinder und Enkel Abfragen nur ausgeführt, und die ganze schmutzige Arbeit wird von EF Navigationseigenschaft fix-up getan:

// Load parents 
var parentQuery = _ge.scheduleheaders.Where(a => a.programID == _id); 
var parents = parentQuery.ToList(); 
// Load children 
var childQuery = parentQuery.SelectMany(p => p.scheduledetails); 
childQuery.Load(); 
// Load grandchildren 
childQuery.SelectMany(c => c.scheddtlcustoms).Load(); 
childQuery.SelectMany(c => c.scheddtlstandards).Load(); 
childQuery.SelectMany(c => c.scheddtltalks).Load(); 
childQuery.SelectMany(c => c.scheddtlvenues).Load(); 
childQuery.SelectMany(c => c.scheduledtlrecurrences).Load(); 
// Done 
return parents; 
+0

Ich werde dies versuchen und ich werde Sie wissen lassen, wie es funktioniert. – mattgcon

1

Sie könnten versuchen, so etwas wie:

  var query = context 
        .Parents 
        .Include(p=>p.children) 
        .Include(p=>p.children.Select(x=>x.Grandchild1)) 
        .Include(p=>p.children.Select(x=>x.Grandchild2)) 
        .ToList(); 

Sie dies mit linq zugreifen können, können Sie eine ID haben, wo man so etwas tun könnte:

var grandchild6 = query 
        .children 
        .FirstOrDefault(child=>child.Id =1) 
       ?.GranChildern 
       ?.FirstOrDefault(grandChild=>grandchild.Id = 6); 
+0

Aus irgendeinem Grund ist es nur mir erlaubt zu betreten eine Zeichenfolge innerhalb der Klammern einschließen. – mattgcon

+0

Sie müssen möglicherweise hinzufügen "using System.Data.Entity" zu den using Statements – 3xGuy

+0

Vielen Dank für diesen 'using' Tipp. Ihre Lösung funktioniert sehr gut, aber ich habe eine kleine erweiterte Frage in Bezug auf Urenkel. sagen wir von 'x.Grandchild1'. Wie würde ich gehen, um das zu bekommen, ich habe bereits versucht, das Include zu imitieren, aber es scheint nicht zu funktionieren – mattgcon

Verwandte Themen