Dettagli sul metodo SelectDTO

di , 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

Dettagli sul metodo SelectDTO
| Condividi su: Twitter, Facebook, LinkedIn, Google+

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