Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在linq中处理空值?_C#_Linq_Select_Null_Dynamic List - Fatal编程技术网

C# 如何在linq中处理空值?

C# 如何在linq中处理空值?,c#,linq,select,null,dynamic-list,C#,Linq,Select,Null,Dynamic List,上述代码中的方法GetAttendanceListOf(q.\u RollNumber)将从数据库返回记录列表,如果传递的“roll no”没有记录,则返回“null”。linq查询将被终止并生成错误 “值不能为空” 是否有办法处理此错误并使LINQ跳转到下一步 recordsList.ListOfRecords = new StudentRecordsBAL() .GetStudentsList()

上述代码中的方法GetAttendanceListOf(q.\u RollNumber)将从数据库返回记录列表,如果传递的“roll no”没有记录,则返回“null”。linq查询将被终止并生成错误

“值不能为空”

是否有办法处理此错误并使LINQ跳转到下一步

recordsList.ListOfRecords = new StudentRecordsBAL()
                                .GetStudentsList()
                                .Select(q => new StudentRecords()
            {
                _RollNumber = q._RollNumber,
                _Class = q._Class,
                _Name = q._Name,
                _Address = q._Address,
                _City = q._City,
                _State = q._State,
                _Subjects = q._Subject,
                _AttendedDays = new AttendanceBAL()
                                    .GetAttendanceListOf(q._RollNumber)
                                    .Where(date => date != null)
                                    .Select(date => 
                                        new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
                                    .Distinct()
                                    .ToList(),
                _AttendedSubjects = GetAttendedSubjects(q._RollNumber)                                            
        }).ToList(); 
问题在于在空实例上运行
Where()
。可能的解决办法:

1) 修改
GetAttendanceListOf
以在没有出席时返回一个空列表(一般来说,这是一个好主意,因为它通常是一个救命稻草,对于集合,空集合通常在语义上类似于null)
2) 如果您不控制该方法,请编写一个安全的扩展方法,如果为null,该方法将返回空列表,例如

_AttendedDays = new AttendanceBAL()
    .GetAttendanceListOf(q._RollNumber)
    .Where(date => date != null)
    .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day))
    .Distinct()
    .ToList(),
如果没有结果,Linq ToList()将返回一个空列表。 错误可能来自其他地方

我建议您使用方法来创建对象,这将使您的查询更易于阅读和调试。我建议您分多个步骤来确定什么是null,以及它在哪里无法执行

错误可能来自GetAttendanceListOf(),当方法返回IList或IEnumerable时,如果没有结果,则应返回空列表,这将阻止您每次验证它是否为null

你可以试试

_AttendedDays = new AttendanceBAL()
    .SafeAttendanceListOf(q._RollNumber)
    .Where(date => date != null)

这将检查您是否未对空对象执行
Where
操作,并过滤掉任何空结果。

如@Zdeslav Vojkovic建议,修改
GetAttendanceListOf
以在空时返回空列表,或执行类似操作:

recordsList.ListOfRecords = new StudentRecordsBAL().GetStudentsList().Select(q => 
            {
                var attendanceList = new AttendanceBAL().GetAttendanceListOf(q._RollNumber);
                if (attendanceList == null)
                    return null;
                return new StudentRecords()
                    {
                        _RollNumber = q._RollNumber,
                        _Class = q._Class,
                        _Name = q._Name,
                        _Address = q._Address,
                        _City = q._City,
                        _State = q._State,
                        _Subjects = q._Subject,
                        _AttendedDays = attendanceList.Where(date => date != null).Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)).Distinct().ToList(),
                        _AttendedSubjects = GetAttendedSubjects(q._RollNumber)
                    };
            }).Where(q => q != null).ToList(); 
_出席天数=(新的出席人数表() .GetAttendanceListOf(q._RollNumber)??枚举器.Empty() .Where(日期=>date!=null) .选择(日期=>新日期时间(日期.\u日期.年,日期.\u日期.月,日期.\u日期.日)) .Distinct() .ToList(),
(您可能不需要额外的括号就可以完成此操作)

要快速修复此问题,请修改此行

_AttendedDays=新建AttendanceBAL().GetAttendanceListOf(q.\U RollNumber)。其中

对此

_AttendedDays=(新建AttendanceBAL().GetAttendanceListOf(q.\U RollNumber)?新建列表())。其中


也许你可以使用
Where(q=>q!=null)
,过滤掉空值?或者,如果可以的话,你可以使用
Select(l=>l==null?Iterable.Empty:l)
,只要修改
GetAttendanceListOf
以返回空列表,如果没有为给定的“roll no”找到任何内容。此扩展方法方案不适用于我,它需要2个参数。但是谢谢你的主意。我以其他方式实现了它并解决了我的问题。不确定我是否理解正确,但第一个参数是
此AttendanceBAL
,因此您仍然像调用它一样调用它,好像它有一个参数:
bal..GetAttendanceListOf(q.\u RollNumber)
。这就是扩展方法的全部要点
recordsList.ListOfRecords = new StudentRecordsBAL().GetStudentsList().Select(q => 
            {
                var attendanceList = new AttendanceBAL().GetAttendanceListOf(q._RollNumber);
                if (attendanceList == null)
                    return null;
                return new StudentRecords()
                    {
                        _RollNumber = q._RollNumber,
                        _Class = q._Class,
                        _Name = q._Name,
                        _Address = q._Address,
                        _City = q._City,
                        _State = q._State,
                        _Subjects = q._Subject,
                        _AttendedDays = attendanceList.Where(date => date != null).Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)).Distinct().ToList(),
                        _AttendedSubjects = GetAttendedSubjects(q._RollNumber)
                    };
            }).Where(q => q != null).ToList(); 
_AttendedDays = (new AttendanceBAL() .GetAttendanceListOf(q._RollNumber) ?? Enumerator.Empty<typeofrecord>()) .Where(date => date != null) .Select(date => new DateTime(date._Date.Year, date._Date.Month, date._Date.Day)) .Distinct() .ToList(),