2010-03-09 14 views
5

Sto riscontrando un problema nel tentativo di rendere il mio LINQ alle query SQL e il mapping agli oggetti del mio dominio ASCIUTO senza incorrere nel costo di più round trip sul db. Dato questo esempio:Linq to Sql DB Object to Domain Object mapping and performance

var query1 = from x in db.DBProducts 
      select new MyProduct 
      { 
       Id = x.ProductId, 
       Name = x.ProductName, 
       Details = new MyProductDetail 
       { 
        Id = x.DBProductDetail.ProductDetailId, 
        Description = x.DBProductDetail.ProductDetailDescription 
       } 
      } 

La query effettuerà UN round trip sul DB. Grande! Tuttavia, il problema che vedo con questo è che alla fine avrò anche un metodo 'GetProductDetails' che dovrà anche eseguire alcuni dei mapping dell'oggetto SAME "oggetto dati -> dominio", molto simile a quello sopra.

per alleviare alcuni della mappatura, ho pensato che potrebbe essere una grande idea di estendere le classi di oggetti dati parziali di fare il mapping per me, in questo modo:

public partial class DBProduct 
{ 
    MyProduct ToDomainObject() 
    { 
     return new MyProduct 
     { 
      Id = this.ProductId, 
      Name = this.ProductName, 
      Details = this.DBProductDetails.ToDomainObject() 
     }; 
    } 
} 

public partial class DBProductDetail 
{ 
    MyProductDetail ToDomainObject() 
    { 
     return new MyProductDetail 
     { 
      Id = this.ProductDetailId, 
      Description = this.ProductDetailDescription 
     }; 
    } 
} 

Nizza! Ora, potrei semplicemente riscrivere Query1 come segue:

var query1 = from x in db.DBProducts 
      select x.ToDomainObject(); 

Questo rende il codice più asciutto e più leggibile. Inoltre, altre query che devono eseguire lo stesso tipo di mapping possono semplicemente utilizzare il metodo ToDomainObject() per il mapping. Funziona, ma con un costo. Durante la visione tramite Profiler, la prima query chiamerebbe il db ONCE, unendo le tabelle dove necessario. La seconda query non si collega in modo appropriato, quindi effettua più chiamate al DB. C'è un modo per realizzare ciò che sto cercando di fare: refactoring LINQ alle query SQL in modo che la mappatura degli oggetti del dominio sia DRY (nessuna duplicazione del codice)?

+0

Questa linea sembra sbagliato ... Dettagli = this.ToDomainObject() - non credo che si desidera chiamare ToDomainObject() ricorsivamente! Forse intendevi Details = this.DBProductDetail.ToDomainObject()? –

+0

Oh, bella cattura! Ho aggiornato il post originale per riflettere questo. Ancora non risolve il mio problema però .. :( – tbehunin

+3

+1. È criminale che questa interessante domanda non abbia generato più discussioni – fearofawhackplanet

risposta

1

Utilizzare AutoMapper. Una volta che hai provato, è improbabile che si potrà mai vedere il codice come questo:

new MyProduct 
{ 
    Id = x.ProductId, 
    Name = x.ProductName, 
    Details = new MyProductDetail 
    { 
     Id = x.DBProductDetail.ProductDetailId, 
     Description = x.DBProductDetail.ProductDetailDescription 
    } 
}