2017-10-20 38 views
1

J'utilise VS2017, pour créer une application Web ASP.NET (n'utilisant pas CORE), .NET Framework est 4.6.2 et Entity Framework .NET est 6.1. 3. J'ai regardé ici pour ma réponse mais tout ce que j'ai essayé ou qui a été mentionné n'est pas disponible pour moi.Retour de plusieurs petits-enfants de l'enfant de parent d'Entity Framework .NET

je le code suivant pour l'acquisition de petits-enfants des enfants d'un parent particulier en ce moment, je sais qu'il doit y avoir un moyen plus efficace d'acquérir ces petits-enfants mais ne peut pas comprendre comment:

  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(); 
     } 

Je essayé en utilisant .ThenInclude et Include("xxxx.xxxx.xxxx") cependant, .ThenInclude n'est même pas disponible pour moi et le Include("xxxx.xxxx.xxxx") ne fonctionne que pour un petit-enfant. Le Include() me permet seulement d'entrer un chemin de chaîne et pourtant j'ai vu des commentaires que l'OP utilisait une ancienne version d'EF.

Je suis coincé là-dessus, puis-je être éclairé s'il me manque quelque chose ici?

Répondre

1

Vous pouvez enchaîner plusieurs Include("xxxx.xxxx.xxxx") comme le souligne dans une autre réponse. Cependant, cela remplacera le nombre actuel de requêtes SQL parents.Count * children.Count * grandChildrenTypes.Count par une requête SQL unique, mais monstre, consolidant toutes les colonnes et tous les enregistrements d'un ensemble de résultats unique, ce qui peut également s'avérer inefficace.

Je vous suggère une approche hybride (similaire à la façon dont EF base traite les Include s) qui exécutera 1 SQL par les parents, 1 par enfant et 1 pour chaque petits-enfants le type, à savoir dans ce cas particulier un total de 7 Requêtes SQL Seul le résultat de la requête mère est stockée dans la variable, les requêtes des enfants et petits-enfants sont tout simplement exécutés, et tout le travail sale se fait par EF propriété de navigation fix-up:

// 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

Je vais essayer ceci et je vous ferai savoir comment cela fonctionne. – mattgcon

1

Vous pouvez essayer quelque chose comme:

  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(); 

vous pouvez accéder à ce avec linq, vous pourriez avoir une carte d'identité où l'on pouvait faire quelque chose comme:

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

Pour une raison étrange, il ne me permet d'entrer une chaîne dans les parenthèses Include. – mattgcon

+0

vous devrez peut-être ajouter 'using System.Data.Entity' à l'utilisation des statuts – 3xGuy

+0

merci pour ce conseil' using'. Votre solution fonctionne très bien, mais j'ai une petite question sur les arrière-petits-enfants. dire de 'x.Grandchild1'. Comment est-ce que j'allais obtenir cela, j'ai déjà essayé d'imiter l'inclusion mais ne peux pas sembler l'obtenir au travail – mattgcon