ホームページ >バックエンド開発 >C++ >単一エンティティの子プロパティを含め、EF Core でエンティティを DTO に効率的に変換するにはどうすればよいですか?

単一エンティティの子プロパティを含め、EF Core でエンティティを DTO に効率的に変換するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-23 19:52:26741ブラウズ

How Can We Efficiently Convert Entities to DTOs in EF Core, Including Single-Entity Child Properties?

EF Core のカスタム DTO 変換に再利用可能なコードを使用する: 単一エンティティのサブプロパティ

問題ステートメント:

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。