【问题标题】:c# linq exception: object reference not set to an instance of an object [duplicate]c#linq异常:对象引用未设置为对象的实例[重复]
【发布时间】:2022-03-02 15:49:22
【问题描述】:

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

如何不抛出此异常?我只想返回一个结果,即使它是空的。

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

【问题讨论】:

    标签: c# linq exception-handling


    【解决方案1】:

    如果未找到对象,此方法 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);
    

    下一步也是一样的。

    【讨论】:

    • 或者可能是db.Table.FirstOrDefault(a => a.item == passed_item)
    • @DavidG 你是对的。我复制并粘贴了大卫的代码,我没有注意这一点。感谢您的评论。
    • 或1行var id = (db.table.FirstOrDefault(a => a.item == passed_item))?.id;
    【解决方案2】:

    您可以改用 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-

    【讨论】:

      【解决方案3】:
      var id = (from a in db.table
            where a.item == passed_item
            select a.id).FirstOrDefault();
      

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

      【讨论】:

      • 好答案!这只会从数据库中选择 ID 字段 - 因此效率更高
      【解决方案4】:

      我看到 null 中的原因是值之一。

      SImageName = (Users.SImageName != null ? Users.SImageName : "User.png")
      

      检查你的数据没有NULL值

                      var userlist = (from Users in _context.TbUsersInfos
                                  join Orgs in _context.TbBaseOrgs
                                     on Users.NOrgCode equals Orgs.NCode
                                  where
                                     Users.NOrgCode == 1
                                  orderby
                                     Users.NUserCode
                                  select new
                                  {
                                      NUserCode = Users.NUserCode.ToString(),
                                      SImageName = (Users.SImageName != null ? Users.SImageName : "User.png"),
                                  }).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多