我有当前的实体:
学生(身份证,姓名,......)
成绩(Id,Student_Id,成绩)
学生可以有更多的成绩..
使用LINQ(实体框架)如何获得所有上一年级不同于10的学生的列表!
我在尝试:
var students = db.students.Where(c => c.Grades.LastOrDefault().Grade != 10) .ToList();
问题是因为我可能没有成绩,LastOrDefault
可能是null
。
答案 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年级。