EF에 개체의 모든 수준을 포함하는 방법은 무엇입니까? [복제]

Nov 23 2020

네트워크 구조를 정의하는 객체가 있는데, 그 객체의 모든 자식과 자식의 자식 등을 보내려고합니다.

지금 나는 이것을 가지고있다 :

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;

이 코드는 대부분의 레벨을 얻을 수 있지만 네트워크에 여러 다른 레이어가있는 경우 모든 레벨을 얻을 수 없습니다. 모든 레이어가 포함되도록 어떻게 만들 수 있습니까?

답변

1 Dominik Nov 23 2020 at 20:21

이론적으로 순환 참조가있을 가능성이 있기 때문에 "모든"레이어를로드하는 방법이 내장되어 있지 않다고 생각합니다.

이 스 니펫은 레이어 수에 대한 쿼리를 생성합니다.

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

용법:

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

이 작업을 수행하는 가장 쉬운 방법은 지연로드입니다. 이 게시물을 살펴보십시오.