Entity Framework Core에서 비컬렉션 하위 엔터티를 DTO에 효율적으로 매핑
Entity Framework Core는 식 트리를 사용하여 엔터티-DTO(데이터 전송 개체) 변환을 단순화합니다. 이는 상위 개체 및 하위 컬렉션에 대해 잘 작동하지만 컬렉션이 아닌 하위 속성을 처리하려면 다른 접근 방식이 필요합니다.
도전:
다음 모델을 고려해보세요.
<code class="language-csharp">public class Model { public int ModelId { get; set; } public string ModelName { get; set; } public virtual ICollection<ChildModel> ChildModels { get; set; } public AnotherChildModel AnotherChildModel { get; set; } }</code>
이와 같은 간단한 표현식을 사용하여 DTO에 직접 매핑하는 것은 AnotherChildModel
:
<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 mapping missing };</code>
해결책: 외부 라이브러리 활용
이 시나리오를 처리하기 위해 여러 라이브러리가 표현식 트리 기능을 확장합니다.
Expandable
특성을 사용하여 쿼리 공급자가 확장할 메서드를 표시합니다.<code class="language-csharp">[Expandable(nameof(AsDtoImpl))] public static ModelDto AsDto(Model model) => AsDtoImpl.Compile()(model); private static readonly Expression<Func<Model, ModelDto>> AsDtoImpl = 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>
검색어에 .AsExpandable()
을 사용하세요.
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .AsExpandable() .ToList();</code>
InjectLambda
속성을 사용합니다.<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
검색어에 .ToInjectable()
을 사용하세요.
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .ToInjectable() .ToList();</code>
Computed
속성을 사용하여 더 간단한 구문을 제공합니다.<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
검색어에 .Decompile()
을 사용하세요.
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .Decompile() .ToList();</code>
이러한 라이브러리는 기본 식 트리 매핑의 제한을 피하면서 Entity Framework Core 쿼리 내에서 비컬렉션 하위 엔터티를 DTO에 매핑하기 위한 효율적인 솔루션을 제공합니다. 프로젝트 요구사항과 코딩 스타일에 가장 적합한 라이브러리를 선택하세요.
위 내용은 Entity Framework Core에서 비컬렉션 하위 엔터티를 DTO로 효율적으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!