Optimierung der DTO-Zuordnung für einzelne untergeordnete Eigenschaften in EF Core
Entity Framework Core (EF Core) vereinfacht die Objekt-zu-DTO-Konvertierung (Data Transfer Object) mithilfe von Ausdrucksbäumen. Dies funktioniert gut für untergeordnete Sammlungen, die Zuordnung einzelner untergeordneter Eigenschaften kann jedoch weniger intuitiv sein. In diesem Artikel werden Lösungen zur Wiederverwendung von Code und zur effizienten Bewältigung dieses Szenarios untersucht.
Die Herausforderung: Zuordnung von Single-Child-Eigenschaften
Das direkte Zuordnen einer einzelnen untergeordneten Eigenschaft zu einem DTO erfordert oft manuelle Ausdruckszusätze, was zu sich wiederholendem Code führt. Betrachten Sie dieses Beispiel:
<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 // Manual mapping here { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
Die Lösung: Nutzung externer Bibliotheken
Mehrere Bibliotheken bieten elegante Lösungen, indem sie effektiv eine .Select()
-ähnliche Funktionalität für einzelne Entitäten hinzufügen und so die Wiederverwendung von Code ermöglichen:
1. LINQKit:
LINQKit ermöglicht die Erweiterung von Ausdrücken und verarbeitet die Zuordnung einzelner untergeordneter Elemente dynamisch.
<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 = model.AnotherChildModel.AsDto() // LINQKit handles this };</code>
2. NeinLinq:
NeinLinq bietet einen ähnlichen Ansatz mit Lambda-Injektion.
<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { _asDto ??= AsDto().Compile(); return _asDto(model); } private static Func<Model, ModelDto> _asDto; private static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // NeinLinq handles this };</code>
3. DelegateDecompiler:
DelegateDecompiler bietet eine präzisere Syntax mithilfe berechneter Eigenschaften. Beachten Sie, dass dieser Ansatz je nach Komplexität Ihres Mappings möglicherweise nicht immer geeignet ist.
<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // DelegateDecompiler handles this };</code>
Jede Bibliothek erfordert eine entsprechende Einrichtung und Konfiguration, um in Ihrem Projekt ordnungsgemäß zu funktionieren.
Fazit:
Diese Bibliotheken bieten effiziente Lösungen für die Wiederverwendung von Code beim Zuordnen einzelner untergeordneter Eigenschaften zu DTOs in EF Core, wodurch Redundanz reduziert und die Wartbarkeit verbessert wird. Die Auswahl der richtigen Bibliothek hängt von den Projektpräferenzen und der Komplexität ab. Der Hauptvorteil ist ein konsistenter und trockener Ansatz (Don't Repeat Yourself) für die DTO-Zuordnung.
Das obige ist der detaillierte Inhalt vonWie kann ich Code zum Zuordnen einzelner untergeordneter Eigenschaften zu DTOs in EF Core wiederverwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!