如何使用FirstOrDefault避免对象引用未设置为对象实例错误

本文关键字:设置 对象 实例 错误 对象引用 何使用 FirstOrDefault | 更新日期: 2024-07-27 16:19:32

这是我的类:

public class Employee
{
     public int EmployeeId { get; set; }
     public int Skillssetpoints { get; set; }
     public string Name { get; set; }
     public string EmployeeCode { get; set; }
     public Nullable<System.DateTime> Date { get; set; }
}

代码:

场景1

var data=context.Employee.ToList();  //Get all employee records.
//Filter records by employee code(Emp01) and fetch single employee code.for eg:Emp01
var empCode = data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim())).EmployeeCode;

这里,如果找不到与Emp01匹配的对象,则获取错误对象引用,该引用未设置为对象的实例,但修复了以下代码:

var Single = data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));
if(single!=null)
{
   var data=Single.EmployeeCode;
   //Rest other code.
}

场景2

var data=context.Employee.ToList();  //Get all employee records.
//Fetch List of employee with Employee code:Emp01
var list= data.FirstOrDefault(t =>(t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));

在我的数据对象中,如果任何EmployeeCodenull,那么我会得到这个错误:

错误:对象引用未设置为对象实例

修复了以下问题:

var list= data.FirstOrDefault(t => (t.EmployeeCode != null) && (t.EmployeeCode.Trim() == Model.EmployeeCode.Trim()));

对于我的第二个场景,当我获取员工的所有记录并按员工代码进行筛选时,我一开始没有添加这个null条件,因为我让所有员工记录都没有任何null的员工代码,一切都很好,但在任何时候,员工代码都变为null并出现了这个错误。所以将来我想避免这个错误。

所以我只想知道有没有更好的方法来处理这两种情况???

如何使用FirstOrDefault避免对象引用未设置为对象实例错误

对于场景1,您可以编写如下内容:

var employees = context.Employee.ToList();
var data = employees.Where(t => t.EmployeeCode.Trim() == Model.EmployeeCode.Trim())
                    .Select(t => t.EmployeeCode)
                    .FirstOrDefault();
if(data != null)
{
   //Rest other code.
}

对于场景2,您可以添加一个额外的where来过滤null。无论你如何切片,你都需要检查,但至少在我看来,拆分过滤更好:

var list= data
          .Where(d => d != null)
          .FirstOrDefault(t => t.EmployeeCode.Trim() == Model.EmployeeCode.Trim());
var employees = context.Employee.ToList();
var result = employees.Where(t => (t.EmployeeCode ?? "").Trim() == (Model.EmployeeCode ?? "").Trim())
                    .Select(t => t.EmployeeCode).FirstOrDefault();