Maison >développement back-end >C++ >Comment pouvons-nous convertir efficacement les entités en DTO dans EF Core, y compris les propriétés enfants d'une seule entité ?

Comment pouvons-nous convertir efficacement les entités en DTO dans EF Core, y compris les propriétés enfants d'une seule entité ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-23 19:52:26687parcourir

How Can We Efficiently Convert Entities to DTOs in EF Core, Including Single-Entity Child Properties?

Utiliser du code réutilisable pour les transformations DTO personnalisées dans EF Core : sous-propriété d'entité unique

Énoncé du problème :

Comment étendre la conversion d'entité en objet DTO pour inclure des sous-propriétés hors collection lors de l'interrogation de données à l'aide d'Entity Framework Core ?

Mise en œuvre :

Dans EF Core, les expressions sont utilisées pour convertir des entités en DTO, ce qui fonctionne très bien pour les entités principales et leurs sous-collections. Cependant, appliquer cette approche aux sous-propriétés non collectives s’est avérée difficile.

Solution :

Pour résoudre ce problème, nous pouvons utiliser des bibliothèques telles que LINQKit, NeinLinq ou DelegateDecompiler. Ces bibliothèques nous permettent de définir une fonction de transformation qui contient une entité principale et des propriétés enfants supplémentaires.

Exemple :

Utilisation de LINQKit :

<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 = new AnotherChildModelDto
        {
            AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId //修正此处
        }
    };</code>

Les requêtes peuvent être développées avant exécution à l'aide de la fonction AsExpandable() de la bibliothèque :

<code class="language-csharp">dbContext.Models
   .Where(m => SomeCriteria)
   .Select(m => Model.AsDto(m))
   .AsExpandable()
   .ToList();</code>

Pour LINQKit, ce processus peut être simplifié en activant l'expansion globale des expressions dans la configuration DbContext. D'autres bibliothèques telles que NeinLinq et DelegateDecompiler proposent des méthodes similaires. Notez que la façon dont l'attribut AnotherChildModel est accessible dans l'exemple de code a été modifiée pour refléter plus précisément le processus d'obtention d'un model.AnotherChildModel à partir d'un AnotherChildModelId. Cela suppose que AnotherChildModel est un objet et non un identifiant distinct.

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