首頁 > 後端開發 > C++ > 我們如何在 EF Core 中有效地將實體轉換為 DTO,包括單一實體子屬性?

我們如何在 EF Core 中有效地將實體轉換為 DTO,包括單一實體子屬性?

Patricia Arquette
發布: 2025-01-23 19:52:26
原創
686 人瀏覽過

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

在EF Core中使用可重複使用程式碼進行自訂DTO轉換:單一實體子屬性

問題陳述:

使用實體框架核心查詢資料時,如何擴充實體到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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板