EF Core での単一の子プロパティの DTO マッピングの合理化
Entity Framework Core (EF Core) は、式ツリーを使用してオブジェクトから DTO (データ転送オブジェクト) への変換を簡素化します。 これは子コレクションにはうまく機能しますが、単一の子プロパティのマッピングは直感的ではない可能性があります。 この記事では、コードを再利用し、このシナリオを効率的に処理するためのソリューションについて説明します。
課題: 単一の子プロパティのマッピング
単一の子プロパティを 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 // Manual mapping here { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
解決策: 外部ライブラリの活用
いくつかのライブラリは、単一のエンティティに .Select()
のような機能を効果的に追加することで洗練されたソリューションを提供し、コードの再利用を可能にします。
1. LINQKit:
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 = model.AnotherChildModel.AsDto() // LINQKit handles this };</code>
2.ナインリンク:
NeinLinq は、ラムダ インジェクションを使用した同様のアプローチを提供します。
<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { _asDto ??= AsDto().Compile(); return _asDto(model); } private static Func<Model, ModelDto> _asDto; private static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // NeinLinq handles this };</code>
3. DelegateDecompiler:
DelegateDecompiler は、計算されたプロパティを使用したより簡潔な構文を提供します。 マッピングの複雑さによっては、このアプローチが常に適切であるとは限らないことに注意してください。
<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // DelegateDecompiler handles this };</code>
プロジェクト内で正しく機能するには、各ライブラリが適切なセットアップと構成を必要とします。
結論:
これらのライブラリは、単一の子プロパティを EF Core の DTO にマッピングするときにコードを再利用するための効率的なソリューションを提供し、冗長性を削減して保守性を向上させます。 適切なライブラリの選択は、プロジェクトの設定と複雑さによって異なります。 主な利点は、DTO マッピングに対する一貫性のある DRY (Don't Reply Yourself) アプローチであることです。
以上がEF Core で単一の子プロパティを DTO にマッピングするコードを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。