ホームページ > バックエンド開発 > C++ > Entity Framework Core で非コレクション子エンティティを DTO に効率的に変換する方法

Entity Framework Core で非コレクション子エンティティを DTO に効率的に変換する方法

Mary-Kate Olsen
リリース: 2025-01-23 19:57:13
オリジナル
820 人が閲覧しました

Entity Framework Core の非コレクション子エンティティを DTO に効率的にマッピングする

Entity Framework Core は、式ツリーを使用してエンティティから DTO (データ転送オブジェクト) への変換を簡素化します。 これは親オブジェクトと子コレクションではうまく機能しますが、コレクション以外の子プロパティを処理するには別のアプローチが必要です。

How to Efficiently Convert Non-Collection Child Entities to DTOs in Entity Framework Core?

課題:

次のモデルを考えてみましょう:

<code class="language-csharp">public class Model
{
    public int ModelId { get; set; }
    public string ModelName { get; set; }
    public virtual ICollection<ChildModel> ChildModels { get; set; }
    public AnotherChildModel AnotherChildModel { get; set; }
}</code>
ログイン後にコピー

このような単純な式を使用して DTO に直接マッピングすると、AnotherChildModel:

では失敗します。
<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 mapping missing
    };</code>
ログイン後にコピー

解決策: 外部ライブラリの活用

いくつかのライブラリは、このシナリオを処理するために式ツリー機能を拡張しています:

  • LINQKit: Expandable 属性を使用して、クエリ プロバイダーによる展開用のメソッドをマークします。
<code class="language-csharp">[Expandable(nameof(AsDtoImpl))]
public static ModelDto AsDto(Model model) => AsDtoImpl.Compile()(model);

private static readonly 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(Model.AsDto)
    .AsExpandable()
    .ToList();</code>
ログイン後にコピー
  • NeinLinq: LINQKit と同様に、InjectLambda 属性を使用します。
<code class="language-csharp">[InjectLambda]
public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
ログイン後にコピー

クエリで .ToInjectable() を使用します:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .ToInjectable()
    .ToList();</code>
ログイン後にコピー
  • DelegateDecompiler: Computed 属性を使用したより単純な構文を提供します。
<code class="language-csharp">[Computed]
public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
ログイン後にコピー

クエリで .Decompile() を使用します:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .Decompile()
    .ToList();</code>
ログイン後にコピー

これらのライブラリは、基本的な式ツリー マッピングの制限を回避して、Entity Framework Core クエリ内の DTO に非コレクション子エンティティをマッピングするための効率的なソリューションを提供します。 プロジェクトのニーズとコーディング スタイルに最適なライブラリを選択してください。

以上がEntity Framework Core で非コレクション子エンティティを DTO に効率的に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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