Dettagli sul metodo SelectDTO
Vorrei aggiungere alcuni dettagli sul mio post riguardo LINQ to Reflection ed in particolare sull'extension method SelectDTO.
Quello che il metodo fa è creare un expression identica a quello che faremmo scrivendo a mano il mapping. Prendiamo per esempio il classico Northwind e una classe di nome CustomerDTO:
public class CustomerDTO { public string ContactName { get; set; } public string ContactTitle { get; set; } public override string ToString() { return String.Format("{0} {1}", ContactTitle, ContactName); } }
Per caricare la lista dei customer e creare istanze del nostro DTO dovremmo fare:
using (NorthwindEntities ne = new NorthwindEntities()) { IList<customerdto> l = ne.Customers.Select(c => new CustomerDTO { ContactName = c.ContactName, ContactTitle = c.ContactTitle }).ToList(); }
Usando il mio extension method invece:
using (NorthwindEntities ne = new NorthwindEntities()) { IList<CustomerDTO> l = ne.Customers.SelectDTO<Customers, CustomerDTO>().ToList(); }
Ciò che si produce è la medesima Expression del metodo classico, perciò LINQ to Entities la tradurrà nel medesimo modo, scaricando solo le colonne che ci interessano:
SELECT 1 AS [C1], [Extent1].[ContactName] AS [ContactName], [Extent1].[ContactTitle] AS [ContactTitle] FROM [dbo].[Customers] AS [Extent1]
Quello che si paga è solo il prezzo di iniziale di reflection per l'analisi delle proprietà in comune tra le due classi. Ovviamente questo è un inizio, va valutato perché comunque ha un costo, ha il vincolo di dover chiamare le proprietà che si vogliono copiare con lo stesso nome, ma lo si può estendere.











