LINQ - 根据最后一个孩子的情况得到父母

时间:2016-02-09 21:49:51

标签: c# entity-framework linq

我有当前的实体:

学生(身份证,姓名,......)

成绩(Id,Student_Id,成绩)

学生可以有更多的成绩..

使用LINQ(实体框架)如何获得所有上一年级不同于10的学生的列表!

我在尝试:

var students = db.students.Where(c => c.Grades.LastOrDefault().Grade != 10) .ToList(); 

问题是因为我可能没有成绩,LastOrDefault可能是null

3 个答案:

答案 0 :(得分:3)

似乎没有人注意到LINQ to Entities中不支持Last(Ordefault)。所以你必须使用另一种方法:

var students = db.students
                 .Where(c => c.Grades.OrderByDescending(g => g.Date)
                 .FirstOrDefault().Grade != 10).ToList();

我必须猜测有一些有用的属性,您可以通过它来订购成绩(Date?)。您不希望依赖数据库生成它们的顺序。

如评论中所述,null值不会在SQL中抛出异常,SQL是评估此表达式的语言。

答案 1 :(得分:1)

您可以在调用Grades之前检查是否存在Last(),如

var students = db.students
    .Where(c => c.Grades.Count() > 0 && c.Last().Grade != 10)
    .ToList()

或者正如评论中指出的那样,您可以利用Any()功能

var students = db.students
    .Where(c => c.Grades.Any() && c.Last().Grade != 10)
    .ToList()

答案 2 :(得分:1)

如果您使用的是C#6(.NET 4.6或更高版本),则可以使用新的Elvis Operator。与Null合并运营商一起。

var students = db.students.Where(c => c.Grades.LastOrDefault()?.Grade != 10 ?? false).ToList(); 

基本上,如果LastOrDefault()为null,则elvis运算符将返回null,否则它将返回Grade

的值

另外两种方式: 检查c.Grades是否有任何值或检查LastOrDefault()是否返回null。 方式1:

var students = db.students.Where(c => c.Grades.LastOrDefault() == null ? false : c.Grades.LastOrDefault().Grade != 10).ToList(); 

方式2:

var students = db.students.Where(c => c.Grades.Any() && c.Grades.LastOrDefault().Grade != 10).ToList(); 

在所有3种方式中,学生的结果是一个列表,其中每个学生至少有一个年级,而最后一个学生不是10年级。