簡化 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中文網其他相關文章!