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