問題ステートメント:
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 中国語 Web サイトの他の関連記事を参照してください。