É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!