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

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

DDD
풀어 주다: 2025-01-23 20:01:11
원래의
427명이 탐색했습니다.

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

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

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

다음 예를 고려해보세요.

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
        }
    };
로그인 후 복사

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

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

      [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 };
      }
    로그인 후 복사
  • NeinLinq: 사용자 정의 람다 표현식을 삽입하기 위한 [InjectLambda]ToInjectable()을 제공합니다. 구현은 속성과 메서드를 대체하는 LINQKit과 유사합니다.

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

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

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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿