Wie kann ich alle Ebenen eines Objekts in EF aufnehmen? [Duplikat]

Nov 23 2020

Ich habe ein Objekt, das eine Netzwerkstruktur definiert. Ich möchte alle Kinder dieses Objekts und die Kinder der Kinder usw. senden.

Im Moment habe ich Folgendes:

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;

Dieser Code erhält die meisten Ebenen, aber wenn ein Netzwerk viele verschiedene Ebenen hat, werden nicht alle Ebenen abgerufen. Wie kann ich es schaffen, dass alle Ebenen enthalten sind?

Antworten

1 Dominik Nov 23 2020 at 20:21

Ich denke, es gibt keine eingebaute Möglichkeit, "alle" Ebenen zu laden, da es theoretisch möglich wäre, dass Sie zyklische Referenzen haben.

Dieses Snippet erstellt eine Abfrage für die Anzahl der Ebenen

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

Verwendung:

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

Ich denke, der einfachste Weg, dies zu erreichen, ist das verzögerte Laden. Schauen Sie sich diesen Beitrag an