> 백엔드 개발 > C++ > Entity Framework Core에서 비컬렉션 하위 엔터티를 DTO로 효율적으로 변환하는 방법은 무엇입니까?

Entity Framework Core에서 비컬렉션 하위 엔터티를 DTO로 효율적으로 변환하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-23 19:57:13
원래의
820명이 탐색했습니다.

Entity Framework Core에서 비컬렉션 하위 엔터티를 DTO에 효율적으로 매핑

Entity Framework Core는 식 트리를 사용하여 엔터티-DTO(데이터 전송 개체) 변환을 단순화합니다. 이는 상위 개체 및 하위 컬렉션에 대해 잘 작동하지만 컬렉션이 아닌 하위 속성을 처리하려면 다른 접근 방식이 필요합니다.

How to Efficiently Convert Non-Collection Child Entities to DTOs in Entity Framework Core?

도전:

다음 모델을 고려해보세요.

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

해결책: 외부 라이브러리 활용

이 시나리오를 처리하기 위해 여러 라이브러리가 표현식 트리 기능을 확장합니다.

  • LINQKit: 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>
로그인 후 복사
  • NeinLinq: LINQKit과 유사하며 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>
로그인 후 복사
  • DelegateDecompiler: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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