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
Libérer: 2025-01-23 19:57:13
original
820 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

Utilisez .AsExpandable() dans votre requête :

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .AsExpandable()
    .ToList();</code>
Copier après la connexion
  • NeinLinq : Similaire à LINQKit, utilisant l'attribut InjectLambda.
<code class="language-csharp">[InjectLambda]
public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
Copier après la connexion

Utilisez .ToInjectable() dans votre requête :

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .ToInjectable()
    .ToList();</code>
Copier après la connexion
  • 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>
Copier après la connexion

Utilisez .Decompile() dans votre requête :

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .Decompile()
    .ToList();</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal