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

EF Core で非コレクション子プロパティを DTO に効率的に変換するにはどうすればよいですか?

DDD
リリース: 2025-01-23 20:01:11
オリジナル
323 人が閲覧しました

How Can I Efficiently Convert Non-Collection Child Properties to DTOs in EF Core?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート