繁体   English   中英

c# linq 异常:未将对象引用设置为对象的实例

[英]c# linq exception: object reference not set to an instance of an object

当我运行 linq 查询时,只有在可以找到项目时才会返回结果; 如果未找到任何项目,则会引发异常“未将对象引用设置为对象的实例”

我怎么不抛出这个异常? 即使结果为空,我也只想返回结果。

var id = db.table.Where(a => a.item == passed_item).FirstOrDefault().id;

如果未找到对象,则此方法FirstOrDefault将返回null 因此,如果您尝试读取id的值,则会引发异常。

避免这种情况的一种方法如下:

// I suppose that the id you want to read is an int.
// If it isn't, please change the code correspondingly. 
int id;

// Try to get the record.
var record = db.table.Where(a => a.item == passed_item)
                     .FirstOrDefault();

// If you find the record you are looking for, then read it's id.
if(record != null) 
{
    id = record.id;
}

更新

另一种选择是遵循DavidG在他的评论中建议的:

var record = db.Table.FirstOrDefault(a => a.item == passed_item);

下一步是一样的。

您可以改用 Null 条件运算符:

int? id = db.table.Where(a => a.item == passed_item).FirstOrDefault()?.id;

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-

var id = (from a in db.table
      where a.item == passed_item
      select a.id).FirstOrDefault();

这将确保它仅在找到某些内容时才尝试取消引用id 否则,无论id属性的默认值是什么(空或零), id都将被分配

https://stackoverflow.com/users/4490058/kugan-kumar的以下回答帮助了我。 想提出一个观点,但不幸的是几天前才在这个网站上注册。 var id = (db.table.FirstOrDefault(a => a.item ==passed_item))?.id;

尽管如此,@Kugan-kumar 谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM