2013-12-18 2 views
0

fields 테이블과의 접합점이있는 many to many 관계에 대한 LINQ to Entities 쿼리 수행 방법을 찾으려고합니다.EF LINQ를 Many to Many 관계에 대한 Entites 쿼리

다음은 도메인 모델입니다 (View 모델을 사용하고 있지만이 예제에서는 간단하게 유지하고 있습니다).

Student Domain model 
StudentID (PK) 
ICollection<StudentCourse> StudentCourses 

StudentCourse Domain model 
StudentCourseID (PK) 
StudentID (FK) 
CourseID (FK) 
ForAdult 
ForSeniour 
Description 

Course Domain model 
CourseID (PK) 
ICollection<StudentCourse> StudentCourses 

참고

  • 접합 테이블 (즉 StudentCourse)은 두 개의 외부 키 이외의 다른 필드를 포함하기 때문에,이 EF 용 엔티티를 생성한다.

나는이 게으른 로딩을 위해 일하고있어

게으른로드. 네비게이션 속성은 'virtual'키워드로 선언되었습니다.

검색어 방법 - 작동합니다!

var student = (from s in context.Students 
       where s.StudentID == id 
       select s).SingleOrDefault<Student>() 

방법 방식 - 작동합니다!

Student student = context.Students.Find(id); 

프로젝션

하지만, 나는 성능상의 이유로, 데이터베이스에 즉 적은 여행을위한 투사로이 작업을 수행하는 것을 선호합니다.

(1 또는) 많은 StudentCourses와 1 명의 학생을 반환하는 LINQ to Entities 쿼리를 작성하는 방법에 정말로 집착하고 있습니다.

내가 무슨 뜻인지 안다면 엔티티가 어떻게 형성되어야하는지 완전히 이해하지 못합니다. 예를 들어 는, 나는 시도했다 :

var myvar = from s in context.Students 
      from sc in s.StudentCourses 
      where s.StudentID == id 
      select s 

내가 필요로하는 것은보기에 다음, 다음보기 모델에 학생에 할당되고 전달 될 수 StudentCourses의 수집과 학생의 엔티티를 반환하는 것입니다 .

이 문제를 해결하기 위해 많은 시간을 할애 해 주셔서 정말 감사하겠습니다.

사이드 노트로, 나는 SingleOrDefault() 메소드를 사용하여 var (IQueryable 내 생각)의 결과를 Student로 캐스팅합니다. 이것을 캐스팅하는 것이 가장 좋은 방법입니까?

답변

1

Include 메서드를 사용하여 관련 엔터티를 열심히로드 할 수 있습니다.

그래서 당신의 LINQ의 예를 사용하여 :

var student = (from s in context.Students 
       where s.StudentID == id 
       select s).Include("StudentCourses").FirstOrDefault(); 

을 그리고 확장 방법을 사용하여 :

var student = context.Students.Include("StudentCourses").FirstOrDefault(id); 

관련 기관으로 채워 StudentCourses 컬렉션이됩니다 반환되는 Student 인스턴스입니다. 이것은 테이블을 함께 결합하는 SQL 쿼리 하나만 호출해야합니다.

다른 질문에 대답하려면 : 나는 위와 같이 대부분 FirstOrDefault을 사용하는 것을 선호합니다. 차이점은 SingleOrDefaultexactly one result을 예상하고 그렇지 않은 경우 예외를 던지며, FirstOrDefault은 학생을 찾을 수없는 경우 null을 반환합니다.

또한 Student의 캐스트가 암시 적이므로 <Student> 유형 매개 변수가 필요하지 않습니다.

+0

매우 효과적입니다. 성능상의 이유로 열을 제한하고 행을 필터링합니다. 즉, 데이터베이스에서 반환 된 결과 집합을 줄이므로 쿼리 투영이 필요합니다. –

+0

Eager 로딩을 배우는 다른 사용자를 위해 중첩 된 포함을 수행 할 수도 있습니다. 위의 예에서 StudentCourses의 탐색 속성 인 SubCourse Domain 모드도 포함시켜 봅니다 (Course Domain 모델과 물리적으로 연결되거나 연결되지 않을 수도 있음). 다음은 하나의 Student, 하나 또는 여러 개의 StudentCourse (s), 하나 또는 여러 개의 Course (s), 하나 또는 여러 SubCourse (s)의 코드 스 니펫입니다.'var student = .StudentID == id select s). 포함 ("StudentCourses.Course"). 포함 ("StudentCourses.SubCourse"). FirstOrDefault();' –

관련 문제