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:
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; } }
Die direkte Zuordnung zu einem DTO mit einem einfachen Ausdruck wie diesem schlägt für AnotherChildModel
:
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 };
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.[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 } };
Verwenden Sie .AsExpandable()
in Ihrer Abfrage:
dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .AsExpandable() .ToList();
InjectLambda
-Attributs.[InjectLambda] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }
Verwenden Sie .ToInjectable()
in Ihrer Abfrage:
dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .ToInjectable() .ToList();
Computed
-Attribut.[Computed] public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }
Verwenden Sie .Decompile()
in Ihrer Abfrage:
dbContext.Models .Where(m => SomeCriteria) .Select(Model.AsDto) .Decompile() .ToList();
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!