將非集合子實體有效地對應到 Entity Framework Core 中的 DTO
Entity Framework Core 使用表達式樹簡化了實體到 DTO(資料傳輸物件)的轉換。 這對於父物件和子集合很有效,但處理非集合子屬性需要不同的方法。
挑戰:
考慮這個模型:
<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>
解決方案:利用外部函式庫
有些函式庫擴充了表達式樹功能來處理這種情況:
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>
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>
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中文網其他相關文章!