Mappage efficace des entités enfants hors collection vers les DTO dans Entity Framework Core
Entity Framework Core simplifie la conversion d'entité en DTO (Data Transfer Object) à l'aide d'arbres d'expression. Cela fonctionne bien pour les objets parents et les collections enfants, mais la gestion des propriétés enfants hors collection nécessite une approche différente.
Le défi :
Considérez ce modèle :
<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>
Le mappage direct vers un DTO à l'aide d'une expression simple comme celle-ci échoue pour 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>
La solution : tirer parti des bibliothèques externes
Plusieurs bibliothèques étendent les capacités de l'arborescence d'expression pour gérer ce scénario :
Expandable
pour marquer les méthodes à développer par le fournisseur de requêtes.<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>
Utilisez .AsExpandable()
dans votre requête :
<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>
Utilisez .ToInjectable()
dans votre requête :
<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>
Utilisez .Decompile()
dans votre requête :
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .Decompile() .ToList();</code>
Ces bibliothèques fournissent des solutions efficaces pour mapper des entités enfants hors collection aux DTO dans les requêtes Entity Framework Core, évitant ainsi les limitations du mappage d'arbre d'expression de base. Choisissez la bibliothèque qui correspond le mieux aux besoins et au style de codage de votre projet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!