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 中国語 Web サイトの他の関連記事を参照してください。