Dettagli sul metodo SelectDTO

di Cristian Civera, in .NET 3.5,

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.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese