的优势使用C#6(.NET 4.6或更高版本),您可以使用新的Elvis Operator。与Null合并运算符一起使用。
var students = db.students.Where(c => c.Grades.LastOrDefault()?.Grade != 10 ?? false).ToList();
基本上Elvis操作符将返回null,如果LastOrDefault()为空,否则它将返回甲级
其他两个可能的方法的价值: 检查是否有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种方式对学生的结果是,每一个学生都有至少1级,其中最后一个是不是10
列表
'问题是因为我可能没有任何成绩,所以LastOrDefault可能为空。“如果这是LINQ到对象,那么这很重要,但是使用EF将被转换为SQL,并且SQL传播空值,而不是抛出NRE。 – Servy
没有成绩的学生会被计算在内吗?比如,“没有成绩”是否意味着算作“最后”的成绩!= 10或者不是?此外,您需要清楚“最后一级”是什么意思 - 如果它是基于某个日期或最高ID的最新的或类似的东西,您必须确保使用'OrderBy'来确保'LastOrDefault '得到正确的记录! – SlimsGhost