2010-03-09 14 views
5

Lb için SQL sorgularımı yapmak ve db'ye çok sayıda gidiş dönüş maliyetini ödemeden alanımdaki nesnelerimin eşleşmesini sağlamak için bir sorun yaşıyorum. Bu örnekte verilenler:Linq to Sql DB Nesneye Nesne Nesne eşleme ve performans

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

Sorgu, DB'ye BIR gidiş dönüş yapacak. Harika! Bununla birlikte, bununla karşılaştığım problem, aynı zamanda, yukarıdakilere çok benzeyen, SAME "veri nesnesi -> alan nesnesi" eşlemesini de yapması gereken bir 'GetProductDetails' yöntemine de sahip olacağım.

haritalama hafifletmek için, ben o kadar olduğu gibi, benim için eşleme yapmaya kısmi veri nesnesi sınıflarını uzatmak için serin bir fikir olabileceğini düşündüm:

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

Güzel!

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

Bu kod daha KURU ve daha okunabilir hale getirir şöyledir: Şimdi, basitçe Sorgu1 yeniden başladı. Ayrıca, aynı tür eşlemeyi yapmak için gereken diğer sorgular, eşleme için yalnızca ToDomainObject() yöntemini kullanabilir. Çalışır, ancak bir bedeli vardır. Profiler ile izlenirken, ilk sorgu gerekli yerlerde tablolara katılmadan db ONCE diyecek. İkinci sorgu uygun şekilde katılmıyor, bu nedenle DB'ye birden çok çağrı yapıyor. Yapmaya çalıştığım şeyi gerçekleştirmenin bir yolu var mı: SQL sorgularına refactor LINQ, böylece etki alanı nesnelerine eşleme DRY (kod çoğaltması yok) mu?

+0

Bu çizgi yanlış görünüyor ... Detaylar = this.ToDomainObject(): Bunu denedim sonra, Hiç böyle bir kod göreceksiniz düşüktür yinelemeli! Belki de demek istediniz Details = this.DBProductDetail.ToDomainObject()? –

+0

Oh, güzel yakalama! Bunu yansıtmak için asıl gönderiyi güncelledim. Yine de sorunumu çözmüyor .. :( – tbehunin

+3

+1 Bu ilginç sorunun daha fazla tartışma yaratmadığı suçtur – fearofawhackplanet

cevap

1

AutoMapper'u kullanın.) (Sana ToDomainObject aramak istediğiniz sanmıyorum -

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