Maison > développement back-end > C++ > Comment puis-je convertir efficacement les propriétés enfants hors collection en DTO dans EF Core ?

Comment puis-je convertir efficacement les propriétés enfants hors collection en DTO dans EF Core ?

DDD
Libérer: 2025-01-23 20:01:11
original
379 Les gens l'ont consulté

How Can I Efficiently Convert Non-Collection Child Properties to DTOs in EF Core?

Simplification de la conversion DTO pour les propriétés enfants hors collection dans EF Core

Entity Framework Core (EF Core) simplifie la conversion d'entité en DTO (Data Transfer Object), en particulier pour les collections enfants. Cependant, la gestion des propriétés enfants individuelles, hors collection, nécessite une approche plus nuancée. L'intégration directe de la logique de conversion dans l'expression, bien que fonctionnelle, conduit à la duplication de code.

Considérez cet exemple :

<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
        {
            AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId
        }
    };</code>
Copier après la connexion

Pour éviter le code répétitif, tirer parti des bibliothèques open source offre une solution plus élégante. Ces bibliothèques injectent des fournisseurs de requêtes personnalisés dans EF Core, permettant la manipulation des arbres d'expression :

  • LINQKit : Utilise l'attribut Expandable et la méthode d'extension AsExpandable pour modifier l'arborescence d'expression.

    <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 = ChildModelToDto(model.AnotherChildModel) //Simplified call
          };
      }
    
      private static AnotherChildModelDto ChildModelToDto(AnotherChildModel model)
      {
          return new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModelId };
      }</code>
    Copier après la connexion
  • NeinLinq : Offres [InjectLambda] et ToInjectable() pour injecter des expressions lambda personnalisées. L'implémentation est similaire à LINQKit, en remplaçant l'attribut et la méthode.

  • DelegateDecompiler : Utilise l'attribut [Computed] pour la traduction directe lambda vers délégué. Encore une fois, la structure reflète l'exemple LINQKit, simplifiant l'appel à une méthode distincte pour plus de clarté.

En utilisant ces bibliothèques, vous pouvez refactoriser la conversion des propriétés enfants en fonctions distinctes et réutilisables, améliorant ainsi considérablement la maintenabilité du code et réduisant la redondance. Le fournisseur de requêtes personnalisées garantit une évaluation correcte des arborescences d’expressions modifiées dans le contexte EF Core.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal