EF Core の非コレクション子プロパティの DTO 変換の合理化
Entity Framework Core (EF Core) は、特に子コレクションのエンティティから 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 { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
コードの繰り返しを避けるために、オープンソース ライブラリを利用することで、より洗練されたソリューションが提供されます。 これらのライブラリはカスタム クエリ プロバイダーを EF Core に挿入し、式ツリーの操作を可能にします。
LINQKit: Expandable
属性と AsExpandable
拡張メソッドを利用して式ツリーを変更します。
<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 = ChildModelToDto(model.AnotherChildModel) //Simplified call }; } private static AnotherChildModelDto ChildModelToDto(AnotherChildModel model) { return new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModelId }; }</code>
NeinLinq: カスタム ラムダ式を挿入するための [InjectLambda]
と ToInjectable()
を提供します。 実装は LINQKit に似ており、属性とメソッドを置き換えます。
DelegateDecompiler: ラムダからデリゲートへの直接変換に [Computed]
属性を使用します。 繰り返しますが、この構造は LINQKit の例を反映しており、わかりやすくするために別のメソッドの呼び出しを簡略化しています。
これらのライブラリを使用すると、子プロパティの変換を個別の再利用可能な関数にリファクタリングでき、コードの保守性が大幅に向上し、冗長性が削減されます。 カスタム クエリ プロバイダーにより、EF Core コンテキスト内で変更された式ツリーが正しく評価されるようになります。
以上がEF Core で非コレクション子プロパティを DTO に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。