>백엔드 개발 >C++ >EF Core에서 비컬렉션 하위 속성을 DTO로 효율적으로 변환하려면 어떻게 해야 합니까?

EF Core에서 비컬렉션 하위 속성을 DTO로 효율적으로 변환하려면 어떻게 해야 합니까?

DDD
DDD원래의
2025-01-23 20:01:11330검색

How Can I Efficiently Convert Non-Collection Child Properties to DTOs in EF Core?

EF Core의 비컬렉션 하위 속성에 대한 DTO 변환 간소화

EF Core(Entity Framework Core)는 특히 하위 컬렉션의 경우 엔터티-DTO(데이터 전송 개체) 변환을 단순화합니다. 그러나 컬렉션이 아닌 개별 하위 속성을 처리하려면 보다 미묘한 접근 방식이 필요합니다. 표현식 내에 변환 논리를 직접 포함하면 기능적이지만 코드 중복이 발생합니다.

다음 예를 고려해보세요.

<code class="language-csharp">public static Expression<Func<Model, ModelDto>> AsDto =>
    model => new ModelDto
    {
        ModelId = model.ModelId,
        ModelName = model.ModelName,
        ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(),
        AnotherChildModel = new AnotherChildModelDto
        {
            AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId
        }
    };</code>

반복적인 코드를 피하기 위해 오픈 소스 라이브러리를 활용하는 것이 더 우아한 솔루션을 제공합니다. 이러한 라이브러리는 사용자 지정 쿼리 공급자를 EF Core에 삽입하여 식 트리를 조작할 수 있도록 합니다.

  • LINQKit: Expandable 특성과 AsExpandable 확장 메서드를 활용하여 표현식 트리를 수정합니다.

    <code class="language-csharp">  [Expandable(nameof(AsDtoImpl))]
      public static ModelDto AsDto(Model model)
      {
          _asDtoImpl ??= AsDtoImpl().Compile();
          return _asDtoImpl(model);
      }
    
      private static Func<Model, ModelDto> _asDtoImpl;
    
      private static Expression<Func<Model, ModelDto>> AsDtoImpl =>
          model => new ModelDto
          {
              ModelId = model.ModelId,
              ModelName = model.ModelName,
              ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(),
              AnotherChildModel = ChildModelToDto(model.AnotherChildModel) //Simplified call
          };
      }
    
      private static AnotherChildModelDto ChildModelToDto(AnotherChildModel model)
      {
          return new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModelId };
      }</code>
  • NeinLinq: 사용자 정의 람다 표현식을 삽입하기 위한 [InjectLambda]ToInjectable()을 제공합니다. 구현은 속성과 메서드를 대체하는 LINQKit과 유사합니다.

  • DelegateDecompiler: 람다에서 위임자로 직접 변환하기 위해 [Computed] 속성을 ​​사용합니다. 이번에도 구조는 LINQKit 예제를 반영하여 명확성을 위해 별도의 메서드에 대한 호출을 단순화했습니다.

이러한 라이브러리를 사용하면 하위 속성 변환을 재사용 가능한 별도의 함수로 리팩터링하여 코드 유지 관리성을 크게 향상하고 중복성을 줄일 수 있습니다. 사용자 지정 쿼리 공급자는 EF Core 컨텍스트 내에서 수정된 식 트리의 올바른 평가를 보장합니다.

위 내용은 EF Core에서 비컬렉션 하위 속성을 DTO로 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.