Maison >développement back-end >C++ >Comment convertir efficacement les entités enfants hors collection en DTO dans Entity Framework Core ?

Comment convertir efficacement les entités enfants hors collection en DTO dans Entity Framework Core ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-23 19:57:13863parcourir

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.

How to Efficiently Convert Non-Collection Child Entities to DTOs in Entity Framework Core?

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 :

  • LINQKit : Utilise l'attribut 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>
  • NeinLinq : Similaire à LINQKit, utilisant l'attribut 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>
  • DelegateDecompiler : Propose une syntaxe plus simple avec l'attribut 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn