2010-03-09 23 views
5

J'ai un problème pour essayer de faire mes requêtes LINQ to SQL et mapper les objets de mon domaine DRY sans encourir le coût de plusieurs allers-retours à la base de données. Compte tenu de cet exemple:Linq to Sql DB Mappage des objets Object to Domain et 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 requête fera un aller-retour à la base de données. Génial! Cependant, le problème que je vois avec ceci est que finalement, j'aurai aussi une méthode 'GetProductDetails' qui devra également faire un peu du même objet "objet de données -> objet de domaine", très similaire à celui ci-dessus.

Pour alléger la cartographie, je pensais que ce serait peut-être une bonne idée d'étendre les classes d'objets de données partielles pour faire la mise en correspondance pour moi, comme ceci:

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

de Nice! Maintenant, je pourrais simplement réécrire query1 comme suit:

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

Ceci rend le code plus SEC et plus lisible. En outre, d'autres requêtes qui doivent effectuer le même type de mappage peuvent simplement utiliser la méthode ToDomainObject() pour le mappage. Cela fonctionne, mais avec un coût. Tout en regardant via Profiler, la première requête appelle le db ONCE, en joignant des tables si nécessaire. La deuxième requête ne se joint pas correctement, ce qui entraîne plusieurs appels à la base de données. Existe-t-il un moyen d'accomplir ce que j'essaie de faire: refactoriser les requêtes LINQ vers SQL pour que le mappage aux objets de domaine soit DRY (pas de duplication de code)?

+0

Cette ligne semble mal ... Détails = this.ToDomainObject() - Je ne pense pas que vous voulez appeler ToDomainObject() récursivement! Peut-être que vous vouliez dire Details = this.DBProductDetail.ToDomainObject()? –

+0

Oh, belle prise! J'ai mis à jour le post original pour refléter cela. Encore ne résout pas mon problème si .. :( – tbehunin

+3

+1 Il est criminel que cette question intéressante n'a pas généré plus de discussion – fearofawhackplanet

Répondre

1

Utilisez AutoMapper. Une fois que vous l'avez essayé, il est peu probable que vous ne verrez jamais le code comme ceci:

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