【问题标题】:Linq Object Reference Not An Instance Of An ObjectLinq 对象引用不是对象的实例
【发布时间】:2014-03-07 19:47:54
【问题描述】:

我在运行 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。我检查了变量,它返回了一个餐厅名称。但我不明白为什么会收到这些错误。

【问题讨论】:

  • Sequence contains no elements 表示查询结果中没有项目。这就是为什么SingleOrDefault() 返回null 而你得到一个NullReferenceException。检查您的查询条件。
  • 您是否尝试过这样编写查询:var RestaurantName = (from r in objCtx.Restaurants where r.id == item.restaurantid select r.Name).SingleOrDefault();
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# asp.net asp.net-mvc linq nullreferenceexception


【解决方案1】:

问题是您的 linq 查询返回一个空集合:

from r in objCtx.Restaurants
where r.id == item.restaurantid
select r

当您在第一个示例中调用SingleOrDefault 时,它会返回null(即默认值)。您会收到 object reference not set ...,因为您尝试在空引用上调用 Name 属性。

在您的第二个示例中,您调用Single。当您在具有 0 或 +1 个元素的列表上执行此操作时,将引发异常。 (正如你所经历的那样)。

解决方案是确保始终检索单个实例,或者在访问该对象的任何属性之前进行检查

【讨论】:

    【解决方案2】:

    正如其他人所说,您的结果集是空的。这将导致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" } 的默认值,以及创建一个匿名对象,但这取决于您。

    【讨论】:

      【解决方案3】:

      问题是集合中没有满足条件的项目。 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;
      

      【讨论】:

        【解决方案4】:

        如您所说,如果您的第二个代码示例(使用 Single 的代码示例)未返回任何元素,则第一个代码示例(使用 SingleOrDefault 的代码示例)返回 null。而且您无法从null 中获取.Name 属性。

        我认为您需要验证您的查询。直接查看数据,或者甚至只是遍历数据并查看输出是什么:

        var restaurants = from r in objCtx.Restaurants
                          where r.id == item.restaurantid
                          select r;
        
        foreach (var restaurant in restaurants)
        {
            string name = restaurant.Name;
        }
        

        我猜这个循环永远不会执行,因为它是空的,你需要弄清楚你的查询出了什么问题。

        如果您需要处理它可能不返回任何元素的情况,那么您只需要一个 if 检查:

        var restaurant = (from r in objCtx.Restaurants
                          where r.id == item.restaurantid
                          select r).SingleOrDefault<Restaurant>();
        
        string restaurantName;
        if (restaurant == null)
            restaurantName = string.Empty;
        else
            restaurantName = restaurant.Name;
        

        【讨论】:

          【解决方案5】:

          如果序列中没有项目,单个将通过异常。

          试试:

          var RestaurantName = ((from r in objCtx.Restaurants
                                    where r.id == item.restaurantid
                                    select r).Any()) ? (from r in objCtx.Restaurants
                                    where r.id == item.restaurantid
                                    select r).SingleOrDefault<Restaurant>().Name : string.empty;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多