2010-03-09 3 views
5

db에 대한 다중 왕복 비용을 들이지 않고 LINQ to SQL 쿼리와 내 도메인 개체에 대한 매핑을 수행하는 데 문제가 있습니다.LINQ to Sql 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 
       } 
      } 

쿼리는 DB에 ONE 라운드 여행을 할 것입니다 : 예를 감안할. 큰! 그러나이 문제는 결국 "GetProductDetails"메서드를 사용하여 위의 메서드와 매우 비슷한 SAME "data object -> domain object"매핑을 수행해야합니다.

맵핑의 일부를 완화하기 위해, 나는 그렇게처럼, 나를 위해 매핑을 수행 할 부분 데이터 객체 클래스를 확장하는 멋진 생각이 될 거라고 생각 :

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

니스!

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

이 코드가 더 건조하고 더 쉽게 읽을 다음과 같이 지금, 나는 단순히 쿼리 1 다시 작성할 수 있습니다. 또한 동일한 유형의 매핑을 수행해야하는 다른 쿼리는 매핑에 ToDomainObject() 메서드를 사용하기 만하면됩니다. 그것은 효과가 있지만 비용은 들지 않습니다. 프로파일 러를 통해보고있는 동안 첫 번째 쿼리는 db ONCE를 호출하여 필요한 경우 테이블을 조인합니다. 두 번째 쿼리가 적절하게 참여하지 않아 DB에 여러 번 호출됩니다. 내가하려는 일을 성취 할 수있는 방법이 있습니까 : refactor LINQ to SQL 쿼리로 도메인 객체에 대한 매핑이 DRY (코드 중복 없음)가되도록하려면?

+0

이 줄 잘못 보이는 ... 세부 = this.ToDomainObject은() : 당신이 그것을 시도하면, 당신이 지금과 같은 코드를 볼 확률이 낮다 재귀 적으로! 아마도 당신은 Details = this.DBProductDetail.ToDomainObject()를 의미합니까? –

+0

오, 멋지게 잡으세요! 나는 그것을 반영하기 위해 원래 게시물을 업데이트했습니다. 그래도 내 문제는 해결하지 못합니다. : – tbehunin

+3

+1이 흥미로운 질문으로 인해 더 많은 토론이 생성되지 않았습니다. – fearofawhackplanet

답변

1

AutoMapper을 사용하십시오.() 나는 당신이 ToDomainObject를 호출 할 생각하지 않는다 -

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