lambda WHERE子句中的空值

时间:2016-12-08 11:41:05

标签: c# linq lambda null

使用Lambda查询时,我们如何避免空异常?在下面的代码中InstallationDateType为null时,我得到一个异常。我该如何解决这个问题?

foreach (AvailableDate availableDate in installationDatesResponseRootObject.Response
              .InstallationDatesResponse
              .AvailableDates
              .Where(a => 
                  a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish))
{
    //Do Something
}

4 个答案:

答案 0 :(得分:3)

尝试使用C#6中引入的Null条件运算符?.

在你的例子中,它将是

a.InstallationDateType?.ToString().ToUpper().Equals(Constants.InstallationDateTypeDish)

答案 1 :(得分:3)

检查installationDatesResponseRootObject,Response,InstallationDatesResponse,AvailableDates是否为空。 然后将LINQ更改为:

 installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates.Where(a => a.InstallationDateType!=null && a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish))

答案 2 :(得分:2)

详细说明我的评论,这是一个例子:

var items = installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates
    .Where(a => a.InstallationDateType?.ToString().ToUpper() == Constants.InstallationDateTypeDish);
if (items.Any())
    foreach (var item in items)
    {
          //Do something
    }

请注意,这只是一个例子。有更好的方法可以检查IEnumerable是否为空。

答案 3 :(得分:1)

问题是因为您在.ToString()引用上被称为null,因此您需要先检查此内容。

有几种不同的检查方法。如果您正在使用最新的C#,那么您可能最好使用slanto提到的C#6中引入的Null条件运算符?.

如果您使用的是旧版C#,那么您可以使用下面的Where方法进行操作。

foreach (AvailableDate availableDate in installationDatesResponseRootObject.Response.InstallationDatesResponse.AvailableDates.Where(a => a.InstallationDateType != null && a.InstallationDateType.ToString().ToUpper() == Constants.InstallationDateTypeDish))
{
    //Do Something
}

希望有所帮助。