簡化 EF Core 中單一子屬性的 DTO 映射
Entity Framework Core (EF Core) 使用表達式樹簡化了物件到 DTO(資料傳輸物件)的轉換。 這對於子集合很有效,但映射單一子屬性可能不太直觀。 本文探討了重複使用程式碼並有效處理此場景的解決方案。
挑戰:獨生子女財產映射
直接將單一子屬性對應到 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 // Manual mapping here { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
解決方案:利用外部函式庫
一些函式庫透過為單一實體有效添加類似於 .Select()
的功能來提供優雅的解決方案,從而實現程式碼重用:
1。 LINQKit:
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 = model.AnotherChildModel.AsDto() // LINQKit handles this };</code>
2。 NeinLinq:
NeinLinq 使用 lambda 注入提供了類似的方法。
<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { _asDto ??= AsDto().Compile(); return _asDto(model); } private static Func<Model, ModelDto> _asDto; private static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // NeinLinq handles this };</code>
3。委託反編譯器:
DelegateDecompiler 使用計算屬性提供更簡潔的語法。 請注意,根據映射的複雜性,此方法可能並不總是合適。
<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // DelegateDecompiler handles this };</code>
每個庫都需要適當的設定和配置才能在您的專案中正常運作。
結論:
這些函式庫提供了在將單一子屬性對應到 EF Core 中的 DTO 時重複使用程式碼的有效解決方案,從而減少冗餘並提高可維護性。 選擇正確的庫取決於專案偏好和複雜性。 核心優勢是採用一致且 DRY(不要重複)的 DTO 映射方法。
以上是如何重複使用程式碼將單一子屬性對應到 EF Core 中的 DTO?的詳細內容。更多資訊請關注PHP中文網其他相關文章!