Heim > Backend-Entwicklung > C++ > Wie können untergeordnete Nicht-Sammlungsentitäten im Entity Framework Core effizient in DTOs konvertiert werden?

Wie können untergeordnete Nicht-Sammlungsentitäten im Entity Framework Core effizient in DTOs konvertiert werden?

Mary-Kate Olsen
Freigeben: 2025-01-23 19:57:13
Original
820 Leute haben es durchsucht

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.

How to Efficiently Convert Non-Collection Child Entities to DTOs in Entity Framework Core?

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>
Nach dem Login kopieren

Die direkte Zuordnung zu einem DTO mit einem einfachen Ausdruck wie diesem schlägt für AnotherChildModel:

fehl
<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>
Nach dem Login kopieren

Die Lösung: Nutzung externer Bibliotheken

Mehrere Bibliotheken erweitern die Ausdrucksbaumfunktionen, um dieses Szenario zu bewältigen:

  • LINQKit: Verwendet das 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>
Nach dem Login kopieren

Verwenden Sie .AsExpandable() in Ihrer Abfrage:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .AsExpandable()
    .ToList();</code>
Nach dem Login kopieren
  • NeinLinq: Ähnlich wie LINQKit, unter Verwendung des InjectLambda-Attributs.
<code class="language-csharp">[InjectLambda]
public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
Nach dem Login kopieren

Verwenden Sie .ToInjectable() in Ihrer Abfrage:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .ToInjectable()
    .ToList();</code>
Nach dem Login kopieren
  • DelegateDecompiler: Bietet eine einfachere Syntax mit dem Computed-Attribut.
<code class="language-csharp">[Computed]
public static ModelDto AsDto(Model model) { /* ... same implementation as LINQKit ... */ }</code>
Nach dem Login kopieren

Verwenden Sie .Decompile() in Ihrer Abfrage:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .Decompile()
    .ToList();</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage