首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq对象引用而不是对象的实例

Linq对象引用而不是对象的实例
EN

Stack Overflow用户
提问于 2014-03-07 19:47:54
回答 5查看 7.6K关注 0票数 0

当Linq查询运行时,我遇到了问题,我收到了错误Object reference not set to an instance of an object.

代码语言:javascript
运行
复制
var RestaurantName = (from r in objCtx.Restaurants
                      where r.id == item.restaurantid
                      select r).SingleOrDefault<Restaurant>().Name;

然后,我将查询更改为

代码语言:javascript
运行
复制
var RestaurantName = (from r in objCtx.Restaurants
                      where r.id == item.restaurantid
                      select r).Single<Restaurant>().Name;

但是我收到了错误Sequence contains no elements。我检查了变量,它返回了一个餐馆名称。但我不明白为什么我会收到这些错误。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-07 19:52:25

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

代码语言:javascript
运行
复制
from r in objCtx.Restaurants
where r.id == item.restaurantid
select r

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2014-03-07 20:00:54

正如其他人所说,您的结果集是空的。这将导致Single失败(这已记录在案),并将导致SingleOrDefault返回给定类型的默认值(在类的情况下为null)。

除了在其他答案(使用空守卫)中提供的解决方案之外,下面还有一个使用更多LINQ的解决方案:

代码语言:javascript
运行
复制
var RestaurantName = (from r in objCtx.Restaurants
                      where r.id == item.restaurantid
                      select r).DefaultIfEmpty(new Restaurant() { Name="None" })
                               .SingleOrDefault().Name;

DefaultIfEmptySingleOrDefault返回的“默认”值从null更改为提供的值。这样您就可以安全地访问Name属性。根据构建Restaurant类的具体方式,您可能希望以不同的方式创建默认值。您也应该能够提供类似new { Name = "None" }之类的默认设置,创建一个匿名对象,但这取决于您。

票数 2
EN

Stack Overflow用户

发布于 2014-03-07 19:51:53

问题是集合中没有满足条件的项。SingleOrDefault返回null (用于引用类型),因此在第一个版本中,您将收到一个NullReferenceException。如果没有返回的元素,Single会抛出异常,这就是第二种方法失败的原因。

您需要检查是否有任何结果:

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22259344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档