Heim >Backend-Entwicklung >C++ >Wie können untergeordnete Nicht-Sammlungsentitäten im Entity Framework Core effizient in DTOs konvertiert werden?
Effiziente Zuordnung von untergeordneten Nicht-Sammlungsentitäten zu DTOs im Entity Framework Core
Entity Framework Core vereinfacht die Konvertierung von Entitäten in DTO (Data Transfer Object) mithilfe von Ausdrucksbäumen. Dies funktioniert gut für übergeordnete Objekte und untergeordnete Sammlungen, aber der Umgang mit untergeordneten Eigenschaften, die keine Sammlung sind, erfordert einen anderen Ansatz.
Die Herausforderung:
Betrachten Sie dieses Modell:
<code class="language-csharp">public class Model { public int ModelId { get; set; } public string ModelName { get; set; } public virtual ICollection<ChildModel> ChildModels { get; set; } public AnotherChildModel AnotherChildModel { get; set; } }</code>
Die direkte Zuordnung zu einem DTO mit einem einfachen Ausdruck wie diesem schlägt für AnotherChildModel
:
<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 mapping missing };</code>
Die Lösung: Nutzung externer Bibliotheken
Mehrere Bibliotheken erweitern die Ausdrucksbaumfunktionen, um dieses Szenario zu bewältigen:
Expandable
-Attribut, um Methoden für die Erweiterung durch den Abfrageanbieter zu markieren.<code class="language-csharp">[Expandable(nameof(AsDtoImpl))] public static ModelDto AsDto(Model model) => AsDtoImpl.Compile()(model); private static readonly 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>
Verwenden Sie .AsExpandable()
in Ihrer Abfrage:
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .AsExpandable() .ToList();</code>
InjectLambda
-Attributs.<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
Verwenden Sie .ToInjectable()
in Ihrer Abfrage:
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .ToInjectable() .ToList();</code>
Computed
-Attribut.<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
Verwenden Sie .Decompile()
in Ihrer Abfrage:
<code class="language-csharp">dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .Decompile() .ToList();</code>
Diese Bibliotheken bieten effiziente Lösungen für die Zuordnung von untergeordneten Nicht-Sammlungsentitäten zu DTOs innerhalb von Entity Framework Core-Abfragen und vermeiden so die Einschränkungen der grundlegenden Ausdrucksbaumzuordnung. Wählen Sie die Bibliothek, die am besten zu den Anforderungen und dem Codierungsstil Ihres Projekts passt.
Das obige ist der detaillierte Inhalt vonWie können untergeordnete Nicht-Sammlungsentitäten im Entity Framework Core effizient in DTOs konvertiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!