2009-03-28 5 views
2

시리즈, 패밀리 및 브랜드 엔티티의 제품 엔티티 및 관련 엔티티가있는 Entity Framework 코드를 리팩터링하려고합니다. 시리즈, 패밀리 및 브랜드 엔티티는 모두 ID 및 텍스트와 동일한 기본 구조를가집니다. 재산.어떻게이 2 가지 방법을 1로 리팩토링 할 수 있습니까?

아래 두 메서드는 매우 유사하며 단일 메서드로 리팩터링 할 수 있어야하지만 쿼리하는 엔터티를 동적으로 전달하는 방법을 잘 모르겠습니다. 이 경우 db.ProductFamilies 또는 db.ProductSeriesSet을 전달할 수 있어야합니다. 이 아이디어를 어떻게 만드는가?

감사합니다. db.ProductFamilies 및 db.ProductSeriesSet이 같은 기본 클래스에서 상속하는 경우

public DTOs.ProductCollection GetFamily(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var fam = (from collection in db.ProductFamilies.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(fam, true); 
     } 
    } 

    public DTOs.ProductCollection GetSeries(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var ser = (from collection in db.ProductSeriesSet.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(ser, true); 
     } 
    } 

답변

2

, 당신은 ProductCollectionEFToProductCollectionDTO (BaseClass로 OBJ, 부울 값)를 사용하는 경우;

또는 일반 유형을 생각해보십시오.

두 가지 기본 접근 방식이 있습니다.

+0

ProductSeriesSet 또는 ProductFamilies에서 쿼리하는 from 절에서 발견 된 차이점을 처리하는 방법은 무엇입니까? –

+0

나는 네가 네가 내 것보다 낫다는 것을 알지 못했다. –

5

당신은 호출자에게 좋은 개체 모음의 선택을 위임 할 Func<T, TResult>을 사용할 수

여기
public DTOs.ProductCollection Get(int id, Func<Entities, XXX> selector) 
{ 
    using (Entities db = new Entities()) 
    { 
     var result = (from collection in selector(db).Include("Product") 
        .Include("Product.Stuff1") 
        .Include("Product.Stuff2") 
        where collection.Id == id 
        select collection).FirstOrDefault(); 
     return ProductCollectionEFToProductCollectionDTO(result, true); 
    } 
} 

, XXX는 db.ProductFamiliesdb.ProductSeriesSet의 타입이다.

당신은 다음처럼 호출 할 수 있습니다 :

Get(42, db => db.ProductFamilies); 
Get(12, db => db.ProductSeriesSet); 

가 작동합니까?

+0

거의 다 왔어. 문제는 ProductFamilies와 ProductSeriesSet (XXX)에 공통 기본 클래스가 없으므로 XXX을 (를) 대체 할 유형이 없다는 것입니다. 내가 시도한 것은 그들이 구현 한 ProductCollection 인터페이스를 추가하는 것이었다. 다음 주석에 계속 ... – EricAppel

+0

공통 인터페이스를 사용하여 메서드를 구현할 수 있지만 호출 할 때 다음을 수행해야했습니다. GetProductCollection (id, db => (ObjectQuery ) db.ProductFamilies.Cast ()); 계속 ... – EricAppel

+0

캐스트 때문에 "런타임시 LINQ to Entities는 캐스팅 엔터티 데이터 모델 프리미티브 형식 만 지원합니다." 나는이 모든 엔티티들과 함께 작동하는 공통 기본 유형을 얻는 방법을 모르겠습니다. 각 엔티티는 다른 테이블에서 공통 필드를 가져옵니다. 엔티티에 대해 일반적으로 어떻게 작업 할 수 있습니까? – EricAppel

관련 문제