Gleiche Projektionszuordnung in IQueryable.Select, jedoch mit Varied Child Collection-Filtern in EF6C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Gleiche Projektionszuordnung in IQueryable.Select, jedoch mit Varied Child Collection-Filtern in EF6

Post by Anonymous »

Ich habe Methoden in IQueryable.Select(...) verwendet, die die gleiche Logik der Zuordnung einer Entity-Klasse zu einer DTO-Klasse verwenden, aber die Navigationseigenschaften in der Projektion anders filtern. Das Problem besteht darin, dass zum Filtern der untergeordneten Sammlungen viele verschiedene Möglichkeiten erforderlich sind. Dies bedeutet, dass sie alle dieselbe Zuordnungslogik verwenden, um ParentEntity auf ParentDTO abzubilden. Daher versuche ich, diese Zuordnungslogik zu extrahieren.
Der Grund, warum ich nicht einfach zwei separate Abfragen für Produkte und Etiketten durchgeführt habe, ist, dass es bei N Produkten N zusätzliche SQL-Abfragen für Etiketten gibt (und N könnte groß sein).
Hinweis: .AsExpandable() und .Invoke() stammen aus LinqKit Core, sodass verschachtelte Ausdrücke von Linq korrekt übersetzt werden können Sql.) Außerdem verwende ich .NET Framework 4.8 mit Entity Framework 6.
Unten ist der Code, den ich jetzt habe (und die generierte SQL-Abfrage sieht gut aus. Kein N+1-Problem.) Gibt es überhaupt eine Möglichkeit, die Zuordnungslogik zu extrahieren? (Ich bin offen für die Verwendung von AutoMapper, wenn das der richtige Weg sein sollte.)

Code: Select all

/*DAO methods*/
public List ListProductsFilteredByLabelCustomerID
(string productType, string customerID)
{
return context.Product
.AsExpandable()
.Where(product => product.ProductType == productType)
.Select(ToDTOFilteredByLabelCustomerID(customerID));
}

public List ListProductsFilteredByLabelCustomerType
(string productType, string customerType)
{
return context.Product
.AsExpandable()
.Where(product => product.ProductType == productType)
.Select(ToDTOFilteredByLabelCustomerType(customerID));
}

/*Projection Expressions*/
public static Expression
ToDTOFilteredByLabelCustomerID(string customerID)
{
return product => new ProductLabelsDTO {
// I hope to extract these assignments
productName = product.Name,
productDescription = product.Description,
productSKU = product.SKU,
// skipped bunch of other product's fields for simplicity...
//

Labels = product.Labels
.Where(label => label.CustomerID == customerID)
.Select(label => LabelDTO.ToDTO().Invoke(label))
};
}

public static Expression
ToDTOFilteredByLabelCustomerType(string customerType)
{
return product => new ProductLabelsDTO {
// I hope to extract these assignments
productName = product.Name,
productDescription = product.Description,
productSKU = product.SKU,
// skipped bunch of other product's fields for simplicity...
//

Labels = product.Labels
.Where(label => label.CustomerType == customerType)
.Select(label => LabelDTO.ToDTO().Invoke(label))
};
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post