我浏览了这条线,而不是那些旧代码,并且不明白为什么有人会这样做:
return dbStudents.MethodToReturnAllStudents()?.Select(x => new dtoStudent(x));
MethodToReturnAllStudents
返回IEnumerable<SQLDomain.Student>
(dtoStudent
)位于不同的命名空间中 - 所有SQLDomain.Student
都已从IDataRecord
映射。
为什么在本声明的中间会有?
。如果Select
返回MethodToReturnAllStudents
,LINQ null
会尝试执行任何操作吗?
这只是一个可怕的代码吗?
旁注:无论哪种方式,我都会重构它以遵循一些替代标准并且更具可读性。
答案 0 :(得分:1)
它不是&#34;可怕&#34;代码,但如果您不熟悉语法,则它不直观。我个人喜欢不那么冗长的选择。如果MethodToReturnAllStudents()返回null并且只返回null,则LINQ将停止。它基本上是在说
var retVal = dbstudents.MethodToReturnAllStudents();
if(retVal == null) {
return retVal;
} else {
return retVal.Select(x => new dtoStudent(x));
}
现在正如用户指出的那样,它不应该返回null,因为调用者期望IEnumerable。
var retVal = dbstudents.MethodToReturnAllStudents();
if(retVal == null) {
return new List<student>();
} else {
return retVal.Select(x => new dtoStudent(x));
}
使用空合并运算符可以使代码更简洁,并且仍然可以正确处理返回类型,因此它不会返回null:
return dbStudents.MethodToReturnAllStudents()?.Select(x => new dtoStudent(x)) ?? new List<student>();