Comment inclure tous les niveaux d'un objet dans EF? [dupliquer]

Nov 23 2020

J'ai un objet qui définit une structure de réseau, je veux envoyer tous les enfants de cet objet et les enfants des enfants et ainsi de suite.

En ce moment, j'ai ceci:

var Data = await _context.Scans
                .Include(c => c.networkDevices)
                .ThenInclude(d => d.ports)
                .ThenInclude(p => p.Service)
                .Include(c => c.root)
                .ThenInclude(d => d.children).ThenInclude(p => p.children).ThenInclude(c => c.children)
                .ToListAsync();
            return Data;

Ce code obtiendra la plupart des niveaux, mais si un réseau a de nombreuses couches différentes, il ne les obtiendra pas toutes. Comment puis-je faire en sorte que toutes les couches soient incluses.

Réponses

1 Dominik Nov 23 2020 at 20:21

Je pense qu'il n'y a pas de méthode intégrée pour charger "toutes" les couches parce qu'en théorie, il serait possible que vous ayez des références cycliques.

Cet extrait créera une requête pour le nombre de couches

namespace System.Data.Entity
{
  using Linq;
  using Linq.Expressions;
  using Text;

  public static class QueryableExtensions
  {
    public static IQueryable<TEntity> Include<TEntity>(this IQueryable<TEntity> source,
      int levelIndex, Expression<Func<TEntity, TEntity>> expression)
    {
      if (levelIndex < 0)
        throw new ArgumentOutOfRangeException(nameof(levelIndex));
      var member = (MemberExpression)expression.Body;
      var property = member.Member.Name;
      var sb = new StringBuilder();
      for (int i = 0; i < levelIndex; i++)
      {
        if (i > 0)
          sb.Append(Type.Delimiter);
        sb.Append(property);
      }
      return source.Include(sb.ToString());
    }
  }
}

Usage:

var children = await DbContext.Roots
  .Include(3, a => a.Children)
  .SingleOrDefaultAsync(a => a.Id == 5);
rodrigo.cantunes Nov 23 2020 at 20:40

Je pense que le moyen le plus simple d'y parvenir est de charger paresseux, jetez un œil à cet article