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 중국어 웹사이트의 기타 관련 기사를 참조하세요!