Problemstellung:
Wie kann die Konvertierung von Entitäten in DTO-Objekte erweitert werden, um Untereigenschaften außerhalb der Sammlung einzubeziehen, wenn Daten mit Entity Framework Core abgefragt werden?
Umsetzung:
In EF Core werden Ausdrücke verwendet, um Entitäten in DTOs zu konvertieren, was für Hauptentitäten und ihre Untersammlungen hervorragend funktioniert. Allerdings hat sich die Anwendung dieses Ansatzes auf nicht kollektive Untereigentümer als schwierig erwiesen.
Lösung:
Um dieses Problem zu lösen, können wir Bibliotheken wie LINQKit, NeinLinq oder DelegateDecompiler verwenden. Mit diesen Bibliotheken können wir eine Transformationsfunktion definieren, die eine Hauptentität und zusätzliche untergeordnete Eigenschaften enthält.
Beispiel:
Mit 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>
Abfragen können vor der Ausführung mit der AsExpandable()
-Funktion der Bibliothek erweitert werden:
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(m => Model.AsDto(m)) .AsExpandable() .ToList();</code>
Für LINQKit kann dieser Prozess vereinfacht werden, indem die Ausdruckserweiterung global in der DbContext-Konfiguration aktiviert wird. Andere Bibliotheken wie NeinLinq und DelegateDecompiler bieten ähnliche Methoden. Beachten Sie, dass die Art und Weise, wie im Beispielcode auf das Attribut AnotherChildModel
zugegriffen wird, geändert wurde, um den Prozess des Abrufens eines model.AnotherChildModel
aus einem AnotherChildModelId
genauer wiederzugeben. Dies setzt voraus, dass AnotherChildModel
ein Objekt und keine separate ID ist.
Das obige ist der detaillierte Inhalt vonWie können wir Entitäten in EF Core effizient in DTOs konvertieren, einschließlich untergeordneter Eigenschaften einzelner Entitäten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!