当Linq查询运行时,我遇到了问题,我收到了错误Object reference not set to an instance of an object.
var RestaurantName = (from r in objCtx.Restaurants
where r.id == item.restaurantid
select r).SingleOrDefault<Restaurant>().Name;然后,我将查询更改为
var RestaurantName = (from r in objCtx.Restaurants
where r.id == item.restaurantid
select r).Single<Restaurant>().Name;但是我收到了错误Sequence contains no elements。我检查了变量,它返回了一个餐馆名称。但我不明白为什么我会收到这些错误。
发布于 2014-03-07 19:52:25
问题是,linq查询返回一个空集合:
from r in objCtx.Restaurants
where r.id == item.restaurantid
select r在第一个示例中调用SingleOrDefault时,它返回null (即默认值)。您收到一个object reference not set ...,因为您试图在空引用上调用Name属性。
在第二个例子中,您调用了Single。在具有0或+1元素的列表上执行此操作时,将引发异常。(正如你所经历的)。
解决方案是要么确保始终检索单个实例,要么在访问该对象上的任何属性之前进行检查。
发布于 2014-03-07 20:00:54
正如其他人所说,您的结果集是空的。这将导致Single失败(这已记录在案),并将导致SingleOrDefault返回给定类型的默认值(在类的情况下为null)。
除了在其他答案(使用空守卫)中提供的解决方案之外,下面还有一个使用更多LINQ的解决方案:
var RestaurantName = (from r in objCtx.Restaurants
where r.id == item.restaurantid
select r).DefaultIfEmpty(new Restaurant() { Name="None" })
.SingleOrDefault().Name;DefaultIfEmpty将SingleOrDefault返回的“默认”值从null更改为提供的值。这样您就可以安全地访问Name属性。根据构建Restaurant类的具体方式,您可能希望以不同的方式创建默认值。您也应该能够提供类似new { Name = "None" }之类的默认设置,创建一个匿名对象,但这取决于您。
发布于 2014-03-07 19:51:53
问题是集合中没有满足条件的项。SingleOrDefault返回null (用于引用类型),因此在第一个版本中,您将收到一个NullReferenceException。如果没有返回的元素,Single会抛出异常,这就是第二种方法失败的原因。
您需要检查是否有任何结果:
var restaurant = (from r in objCtx.Restaurants
where r.id == item.restaurantid
select r).SingleOrDefault<Restaurant>();
string restaurantName;
if (restaurant != null)
restaurantName = restaurant.Name;
else
restaurantName = string.Empty;https://stackoverflow.com/questions/22259344
复制相似问题