2012-08-15 2 views
3

다음과 같은 간단한 데이터 구조가 있습니다. 고유 ID가있는 학생 목록. 각 학생에게는 자신이 등록한 코스 목록이 있습니다. 코스도 고유 한 ID를 갖지만 여러 코스의 학생 목록이 있습니다 (각 코스는 여러 학생이 등록 함).LINQ를 사용하여 내부 목록의 값 얻기

나는 studentId와 courseId에 의해 특정 학년의 가치를 찾고 있습니다. 아래 linq 쿼리를 사용하고 있습니다. 난 아직도 내 linq와 약간의 흔들림이야, 내가 작성한 쿼리가 정확한지 궁금 해서요? 올바르게 작동하지만 더 우아하고 읽기 쉽도록 변경할 수 있습니까?

var studentGrade = 
    (from student in students 
    where student.studentId == 1 
    from course in student.studentCourses 
    where course.courseId == 1 
    select course.grade) 
     .FirstOrDefault(); 

어떤 부분 (학생/과정)의 경우 조회가 실패의, 시퀀스가 ​​비어되며 FirstOrDefault 당신에게 0을 줄 것이다 :

class Student { 
    int studentId; 
    string studentName; 
    List<Course> studentCourses; 
} 

class Course { 
    int courseId; 
    string courseName; 
    int grade; 
} 

List<Student> students = new List<Student>(); 
//populate list.     
int studentGrade = students 
    .Where(c => c.studentId == 1) 
    .Select(c => c.studentCourses.FirstOrDefault(a => a.courseId == 1).grade) 
    .FirstOrDefault(); 
+1

그냥 다른 방법으로 같은

int studentGrade = students .FirstOrDefault(s => s.studentId == 1).studentCourses .FirstOrDefault(c => c.courseId == 1).grade; 

뭔가 다른 존재한다. 'int studentGrade = students.FirstOrDefault (s => s.studentId == 1) .studentCourses.FirstOrDefault (c => c.courseId == 1) .grade;' –

답변

1
int studentGrade = students 
         .Where(d=>d.studentId == 1) 
         .FirstOrDefault().studentCourses 
         .FirstOrDefault(d=>d.courseId == 1).grade; 
4

나는 쿼리 구문의 비트를 사용합니다.

SelectMany으로이 작업을 수행 할 수도 있습니다. 이는 복수형 from이 번역 한 내용입니다. 당신이 확실한 경우

0

학생 및 과정은 다음

var student = students.FirstOrDefault(s => s.studentId == 1); 
var course = student != null ? student.studentCourses.FirstOrDefault(c => c.courseId == 1) : null; 
int studentGrade = course != null ? course.grade : -1; 
관련 문제