문제 설명:
Entity Framework Core를 사용하여 데이터를 쿼리할 때 비컬렉션 하위 속성을 포함하도록 엔터티를 DTO 개체 변환으로 확장하는 방법은 무엇입니까?
구현:
EF Core에서는 표현식을 사용하여 엔터티를 DTO로 변환합니다. 이는 기본 엔터티와 해당 하위 컬렉션에 적합합니다. 그러나 이 접근 방식을 비집합 하위 속성에 적용하는 것은 어려운 것으로 입증되었습니다.
해결책:
이 문제를 해결하기 위해 LINQKit, NeinLinq 또는 DelegateDecompiler와 같은 라이브러리를 사용할 수 있습니다. 이러한 라이브러리를 사용하면 기본 엔터티와 추가 하위 속성을 포함하는 변환 함수를 정의할 수 있습니다.
예:
LINQKit 사용:
<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 = new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId //修正此处 } };</code>
라이브러리의 AsExpandable()
기능을 사용하여 실행 전에 쿼리를 확장할 수 있습니다.
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(m => Model.AsDto(m)) .AsExpandable() .ToList();</code>
LINQKit의 경우 DbContext 구성에서 전역적으로 표현식 확장을 활성화하여 이 프로세스를 단순화할 수 있습니다. NeinLinq 및 DelegateDecompiler와 같은 다른 라이브러리도 비슷한 방법을 제공합니다. 샘플 코드에서 AnotherChildModel
속성에 액세스하는 방식은 model.AnotherChildModel
에서 AnotherChildModelId
를 가져오는 프로세스를 보다 정확하게 반영하도록 수정되었습니다. 이는 AnotherChildModel
이 별도의 ID가 아닌 객체라고 가정합니다.
위 내용은 단일 엔터티 하위 속성을 포함하여 EF Core에서 엔터티를 DTO로 효율적으로 변환하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!