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
Libérer: 2025-01-23 19:52:26
original
686 Les gens l'ont consulté

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

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

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!

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