Heim >Backend-Entwicklung >C++ >Wie kann ich untergeordnete Nicht-Sammlungseigenschaften in EF Core effizient in DTOs konvertieren?

Wie kann ich untergeordnete Nicht-Sammlungseigenschaften in EF Core effizient in DTOs konvertieren?

DDD
DDDOriginal
2025-01-23 20:01:11324Durchsuche

How Can I Efficiently Convert Non-Collection Child Properties to DTOs in EF Core?

Optimierung der DTO-Konvertierung für untergeordnete Nicht-Sammlungseigenschaften in EF Core

Entity Framework Core (EF Core) vereinfacht die Konvertierung von Entitäten in DTO (Data Transfer Object), insbesondere für untergeordnete Sammlungen. Der Umgang mit einzelnen, nicht zur Sammlung gehörenden untergeordneten Eigenschaften erfordert jedoch einen differenzierteren Ansatz. Das direkte Einbetten der Konvertierungslogik in den Ausdruck ist zwar funktionsfähig, führt jedoch zu einer Codeduplizierung.

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
        {
            AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId
        }
    };</code>

Um sich wiederholenden Code zu vermeiden, bietet die Nutzung von Open-Source-Bibliotheken eine elegantere Lösung. Diese Bibliotheken fügen benutzerdefinierte Abfrageanbieter in EF Core ein und ermöglichen so die Bearbeitung von Ausdrucksbäumen:

  • LINQKit: Verwendet das Expandable-Attribut und die AsExpandable-Erweiterungsmethode, um den Ausdrucksbaum zu ändern.

    <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 = ChildModelToDto(model.AnotherChildModel) //Simplified call
          };
      }
    
      private static AnotherChildModelDto ChildModelToDto(AnotherChildModel model)
      {
          return new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModelId };
      }</code>
  • NeinLinq: Bietet [InjectLambda] und ToInjectable() zum Einfügen benutzerdefinierter Lambda-Ausdrücke. Die Implementierung ähnelt LINQKit und ersetzt das Attribut und die Methode.

  • DelegateDecompiler: Verwendet das [Computed]-Attribut für die direkte Lambda-zu-Delegate-Übersetzung. Auch hier spiegelt die Struktur das LINQKit-Beispiel wider und vereinfacht aus Gründen der Übersichtlichkeit den Aufruf einer separaten Methode.

Durch die Verwendung dieser Bibliotheken können Sie die Konvertierung untergeordneter Eigenschaften in separate, wiederverwendbare Funktionen umgestalten, wodurch die Wartbarkeit des Codes erheblich verbessert und Redundanz reduziert wird. Der benutzerdefinierte Abfrageanbieter stellt die korrekte Auswertung der geänderten Ausdrucksbäume im EF Core-Kontext sicher.

Das obige ist der detaillierte Inhalt vonWie kann ich untergeordnete Nicht-Sammlungseigenschaften in EF Core effizient in DTOs konvertieren?. 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