当Lambda查询使用'包含'并且它与条件"对象引用未设置为对象的实例"错误不匹配时返回错误

Jom*_*ohn 0 .net c# asp.net lambda .net-4.0

平台C#,Dot net 4.0

var city0 = DataCache.GetAllCities().Where(c => c.GeoName.Contains("Dubai")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

变量Duabi存在于数据中,它返回城市对象

var city1 = DataCache.GetAllCities().Where(c => c.CityID== 23804982) .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

数据中不存在id 23804982,这将返回null对象

var city2 = DataCache.GetAllCities().Where(c => c.GeoName.Contains("WrongCityName")).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

变量WrongCityName 在数据中不存在,这将返回以下错误.

你调用的对象是空的.

[编辑]我在上次执行查询时收到错误.不是在我评估city2时

Jon*_*eet 5

好吧,city2将为null,因为您已经使用过FirstOrDefault- 而且类的默认值为null.

在使用之前,您应该检查它是否为null:

if (city2 != null)
{
    // Okay, I found a matching city. Now I can use it
}
Run Code Online (Sandbox Code Playgroud)

现在假设您实际给出的代码正在执行而没有任何问题.如果c.GeoName某个城市是空的,那就不会...因为你要调用Contains一个空引用.你可以解决这个问题:

var city2 = DataCache.GetAllCities()
                     .Where(c => c.GeoName != null &&
                                 c.GeoName.Contains("WrongCityName"))
                     .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)