Mein Ziel ist es, komplexe Objekte mit möglichst wenig Aufwand abzufragen und abzubilden. Ich arbeite mit einer großen Datenbank mit vielen verwandten Tabellen. Ich versuche LINQ Auswahl und Projektion zu verwenden, um nur die notwendigen Informationen auszuwählen, die ich brauche, um das Objekt zu erstellen.Komplexe Objekte abfragen und abbilden
Das ist die ursprüngliche Abfrage, die ich hatte, die schnell war und großartig funktionierte.
List<ClientDTO> clientList = dbClients.Select(client =>
new ClientDTO
{
ID = client.ClientID,
FirstName = client.FirstName,
LastName = client.LastName,
//etc....
Products = client.Products
.Select(prod => new ProductDTO
{
ID = prod.ID,
DateOfTransaction = prod.Date,
//etc...
}).ToList(),
Items = client.Items
.Select(item => new ItemDTO
{
ID = item.ID,
Date = item.Date,
//etc...
}
});
Beachten Sie die Tabelle Client verfügt über 50 verknüpften Tabellen, so dass diese Abfrage funktionierte großartig, dass es nur die Felder, die ich ausgewählt habe das Objekt machen musste.
Nun, was ich tun musste, ist Mapper für diese Objekte zu machen und versuchen, die gleiche Abfrage-Anweisung zu erstellen, aber diesmal die Mapper verwenden. Hier ist, womit ich endete.
List<ClientDTO> clients = dbClients.ProjectToClientDTO();
diese Mapper Mit
public static List<ClientDTO> ProjectToClientDTO(this IQueryable<Clients> query)
{
var clientList = query.Select(client => new
{
ID = client.ClientID,
FirstName = client.FirstName,
LastName = client.LastName,
//etc...
Products = client.Products.AsQueryable().ProjectToProductDTO().ToList(),
Items = client.Items.AsQueryable().ProjectToItemDTO().ToList()
}
List<ClientDTO> dtoClientList = new List<ClientDTO>();
foreach (var client in clientList)
{
ClientDTO clientDTO = new ClientDTO();
clientDTO.EncryptedID = EncryptID(client.ID, client.FirstName, client.LastName);
//etc...
clientDTO.Products = client.Products;
clientDTO.Items = client.Items;
}
return dtoClientList;
}
public static IQueryable<ProductDTO> ProjectToProductDTO(this IQueryable<Products> query)
{
return query.Select(prod => new ProductDTO
{
ID = prod.ID,
DateOfTransaction = prod.Date,
//etc...
});
}
public static IQueryable<ItemDTO> ProjectToItemDTO(this IQueryable<Items> query)
{
return query.Select(item => new ItemDTO
{
ID = item.ID,
Date = item.Date,
//etc...
});
}
Nach dem Versuch, das ich erhalte die folgende Störung zu laufen.
LINQ to Entities nicht erkennt die Methode 'ProjectToProductDTO (IQueryable [Produkte])', und dieses Verfahren kann nicht in einen Laden Ausdruck übersetzt werden. "}
Kann ich LINQ diese Methoden aufrufen die Abfrage zu bauen? Oder gibt es einen besseren Weg, um diese Objekte abzufragen und Karte ohne 50+ Tabellen unnötiger Daten für Hunderte von Kunden zu greifen?
UPDATE
Benutzer Tuco erwähnt, dass ich versuchen könnte, in Ausdrucksbäume zu suchen. Nachdem ich sie ein wenig gelesen hatte, kam ich auf diese Idee.
public static Expression<Func<Product, ProductDTO>> test = prod =>
new ProductDTO()
{
ID= prod.ID,
Date= prod.Date,
//etc...
};
Und verwenden Sie es als solches.
Products = client.Products.Select(prod => test.Compile()(prod)),
Aber läuft dies ich bekomme diesen Fehler.
unterstütztDer LINQ Ausdruck Knotentyp 'Invoke' in LINQ to Entities nicht
EF kehrt nicht alle die Grafik standardmäßig, müssen Sie für jede Navigationseigenschaft einschließen verwenden – Tuco
Ist das nicht ein träges Laden genannt, und ist es nicht standardmäßig aktiviert? – Moe
Ja, aber es wird nicht die Daten ziehen, bis Sie es anfordern – Tuco