2012-08-15 19 views
3

我有以下簡單的數據結構。學生名單,每個學生都有一個唯一的ID。每個學生都有他們參加的課程列表。課程也有唯一的ID,但是將會是多個studentCourses列表的成員(因爲每個課程都由多個學生註冊)。使用LINQ獲取內部列表的值

我試圖通過studentId和courseId來查找特定等級值。我正在使用下面的linq查詢。我仍然對我的linq有點不解,想知道我寫的查詢是否正確?它確實可以正常工作,但可以將其更改爲更優雅/可讀?

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;' – 2012-08-15 10:09:58

回答

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

我會用一個位查詢語法:

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

如果任何部分(學生/課程)的查找失敗,順序將是空的,FirstOrDefault會給你一個零。

這也可以用SelectMany完成,這就是這些多個from可以轉換成的東西。

0

如果你確信學生,當然存在,那麼

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

其他類似

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; 
相關問題