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
Mary-Kate OlsenOriginal
2025-01-23 19:57:13821Durchsuche

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>

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>

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>

Verwenden Sie .AsExpandable() in Ihrer Abfrage:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .AsExpandable()
    .ToList();</code>
  • 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>

Verwenden Sie .ToInjectable() in Ihrer Abfrage:

<code class="language-csharp">dbContext.Models
    .Where(m => SomeCriteria)
    .Select(Model.AsDto)
    .ToInjectable()
    .ToList();</code>
  • 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>

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!

Stellungnahme:
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