首頁 > 後端開發 > 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中文網其他相關文章!

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