2013-10-22 5 views
0

나는 Study and Patient라는 두 가지 EF 유형이 있습니다. 연구에는 많은 환자가있을 수 있습니다. 나는 특정 연구에서 환자의 목록을 반환하려면, 그래서 이런 방법이 있습니다하위 목록을 선택 하시겠습니까?

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    return Context.Studies.Where(e => e.StudyId == id).Select(s => s.Patients).First(); 
} 

이 작동을하지만, 그것은 확실히 끝에 첫 번째() 호출, 이상한 보인다. 내가 제대로하고있는 것처럼 느껴진다. 이를 위해 더 명확하고 정확한 방법이 있습니까?

답변

0

이처럼 쓸 수 있습니다 :

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    return Context.Studies.Single(e => e.StudyId == id).Patients; 
} 

이 다음이 연구와 관련된 모든 환자를 선택, 원하는 연구를 얻을 것이다. 물론 id 매개 변수가 유효한지 확인해야합니다. 원하지 않는 예외를 방지 할이 다음 코드는 발생 :

public IEnumerable<Patient> GetPatientsByStudyId(int id) 
{ 
    Study selectedStudy = Context.Studies.SingleOrDefault(e => e.StudyId == id); 
    return selectedStudy == null ? null : selectedStudy.Patients; 
} 

(또는 Enumerable.Empty<Patient>() 대신 null을 원하는 경우)

+0

는 사실 내가 가진 쿼리가 모든 환자의 목록을 반환하지 않습니다 (내 경우에는 4가) 그래서 그것은 예상대로 동작하지만 그것은 나를 위해 물건을 혼동시키는'First()'입니다. 또한 구문이 나를 위해 작동하지 않습니다. 'Select()'는'Single()'을 끕니다. 아마도 EF6을 사용하고 있기 때문일 수 있습니다. – Nicros

+0

방금 ​​내 게시물을 편집했습니다. 실제로 실수였습니다. 이제는 효과가있다. Select는 SelectMany와는 달리 컬렉션을 병합하지 않기 때문에 초기 쿼리에서 Context.Studies.Where (e => e.StudyId == id) .Select (s => s.Patients)는 환자 콜렉션 콜렉션을 제공합니다. . 이 쿼리의 First() 요소를 사용하면 patient 컬렉션을 얻을 수 있으므로 요청한 결과가 여전히 표시됩니다. –

+0

편집 해 주셔서 감사합니다. 내가 추가해야만하는 것은 환자를위한 포함이었다. 그래서 Context.Studies.Include ("Patients"). Single etc'. 이것은 내 EF 지연로드 설정 때문입니다. 감사! – Nicros

관련 문제