'?'在LINQ声明的中间

时间:2016-08-12 19:55:13

标签: c# linq

我浏览了这条线,而不是那些旧代码,并且不明白为什么有人会这样做:

return dbStudents.MethodToReturnAllStudents()?.Select(x => new dtoStudent(x));

MethodToReturnAllStudents返回IEnumerable<SQLDomain.Student>dtoStudent)位于不同的命名空间中 - 所有SQLDomain.Student都已从IDataRecord映射。

为什么在本声明的中间会有?。如果Select返回MethodToReturnAllStudents,LINQ null会尝试执行任何操作吗?

这只是一个可怕的代码吗?

旁注:无论哪种方式,我都会重构它以遵循一些替代标准并且更具可读性。

1 个答案:

答案 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>();