首頁 >後端開發 >C++ >如何在 EF Core 中有效地將非集合子屬性轉換為 DTO?

如何在 EF Core 中有效地將非集合子屬性轉換為 DTO?

DDD
DDD原創
2025-01-23 20:01:11330瀏覽

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() 用於注入自訂 lambda 表達式。 實作方式和LINQKit類似,只是替換了屬性和方法。

  • DelegateDecompiler: 使用 [Computed] 屬性進行 lambda 到委託的直接轉換。 同樣,該結構反映了 LINQKit 範例,為了清晰起見,簡化了對單獨方法的呼叫。

透過使用這些函式庫,您可以將子屬性轉換重構為單獨的、可重複使用的函數,從而顯著提高程式碼的可維護性並減少冗餘。 自訂查詢提供者可確保在 EF Core 上下文中正確評估修改後的表達式樹。

以上是如何在 EF Core 中有效地將非集合子屬性轉換為 DTO?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn