2010-06-25 2 views
2

우리는 edmx에 각각 엔티티가있는 3 개의 테이블을 가지고 있습니다. 3 표, 내 문제를 설명 상상하기 :엔티티 프레임 워크 4.0 - 엔티티 포함 - 열렬한로드 문제

Table: Make 
Fields: 
makeID 
make 

Table: Model 
FIelds: 
modelID 
makeID foreign key 
model 

Table: Car 
carID 
modelID foreign key 
car 

우리의 제조사, 모델, 및 차량 엔터티를 엔터티 모델의 탐색 속성을 모두 가지고있다. 지연로드가 사용 중지되었습니다. 우리는 Jeep Grand Cherokees 인 모든 차량을 당겨서 우리 페이지로 출력 할 수 있기를 원합니다.

지금 우리는 우리의 기능 중 하나 (C# 4.0)

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Where(mk => mk.make == "Jeep").ToList()); 

_makeRepository.GetQuery()IQueryable 반환에 이런 일이 ... 우리는 (천국이 쿼리는 잘 작동합니다

저장소 패턴을 구현 이 예제를 위해 만들었지 만) 우리의 함수가 반환하도록 자동차 테이블 .Include을 어떻게 할 수 있습니까? 모델이 채워지고 자동차가 채워지는 엔티티 객체를 만듭니다. (직접 탐색이 없기 때문에 자동차를 얻는 데 문제가 있습니다. 속성 만들기)

우리는 POCO 개체를 사용하고 있습니다.

목표는 1 개 기능이 작업을 수행 할 수 있도록 메이크 개체를 반환하는 것입니다 :

이 같은
foreach(Make myMake in makeList) 
{ 
    Response.Write(myMake.make); 

    foreach(Model myModel in myMake.Models) 
    { 
     Response.Write(myModel.model); 

     foreach(Car mycar in myModel.Cars) 
     { 
       Response.Write(mycar.car); 
     } 
    } 
} 

뭔가 가능하지 않는 것 같습니다하지만 우리가 가고있는 무슨 :

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Include(c => mk.Models.Cars) 
     .Where(mk => mk.make == "Jeep").ToList()); 

나는 하나의 개체를 쿼리 할 수 ​​있도록이 모든 정보가 포함 된 새 엔티티를 내 edmx에서 만들려고했으나 키가 매핑되어야한다는 오류가 계속 발생합니다. 맵핑에서 맵핑을 수행했습니다. 탭 (Visual Studio 2010) ... 다시 쿼리를 작동 시키려고합니다.

답변

2

나는 100 % 확실하지 오전하지만 난 당신이 같은 DTO의 일종 만들 필요가하려고 생각 : 다음

public MakeModelCarDto 
{ 
    public IEnumerable<Make> Makes {get; set;} 
    public IEnumerable<Model> Models {get; set;} 
    public IEnumerable<Car> Cars {get; set;} 
} 

이 같은 테이블에 가입해야 할 것 같습니다

_makeRepository.GetQuery() 
     .Join(_modelRepository.GetQuery(), mk => mk.makeid, mo => mo.makeid, (mk, mo) => new { mk, mo }) 
     .Join(_carRepository.GetQuery(), @t => @t.mo.modelid, c => c.modelid, (@t, c) => new { @t, c }) 
     .Where(@t => @[email protected] == "Jeep" && @[email protected] == "Grand Cherokee") 
     .Select(@t => new MakeModelCarDto 
     { 
      Makes = @[email protected], 
      Model = @[email protected], 
      Cars = @t.c 
     }).SingleOrDefault();