2010-03-09 25 views
5

Tengo un problema al tratar de hacer que mis consultas LINQ a SQL y la asignación a objetos de mi dominio sean SECAS sin incurrir en el costo de múltiples viajes de ida y vuelta a la base de datos. Dado este ejemplo:Objeto de asignación de objeto de dominio de dominio a dominio DB

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 consulta realizará UNA ida y vuelta a la base de datos. ¡Estupendo! Sin embargo, el problema que veo con esto es que, eventualmente, también tendré un método 'GetProductDetails' que también tendrá que hacer parte del MISMO mapeo de "objeto de datos -> objeto de dominio", muy similar al anterior.

Para aliviar algunos de los mapas, pensé que podría ser una idea fresca para extender las clases de objetos de datos parciales para hacer el mapeo para mí, así:

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 
     }; 
    } 
} 

Nice! Ahora, yo podría simplemente volver a escribir consulta1 de la siguiente manera:

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

Esto hace que el código sea más seco y más legible. Además, otras consultas que necesitan hacer el mismo tipo de asignación simplemente pueden usar el método ToDomainObject() para la asignación. Funciona, pero con un costo. Mientras mira a través de Profiler, la primera consulta llamaría al db UNA VEZ, uniendo las tablas cuando sea necesario. La segunda consulta no se une de forma adecuada, lo que hace que se realicen múltiples llamadas al DB. ¿Hay alguna manera de lograr lo que estoy tratando de hacer: refactorizar las consultas de LINQ a SQL para que la asignación a los objetos de dominio sea SECA (sin duplicación de código)?

+0

Esta línea se ve mal ... Detalles this.ToDomainObject =() - no creo que desea llamar ToDomainObject() ¡recursivamente! Quizás quiso decir Details = this.DBProductDetail.ToDomainObject()? –

+0

¡Oh, buen truco! Actualicé la publicación original para reflejar eso. Todavía no resuelve mi problema ... :( – tbehunin

+3

+1. Es criminal que esta pregunta interesante no haya generado más discusión. – fearofawhackplanet

Respuesta

1

Use AutoMapper. Una vez que lo hayas probado, es poco probable que usted verá siempre código como este:

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