如何使用Linq使用FirstOrDefault处理NULL对象属性

本文关键字:NULL 对象 属性 处理 FirstOrDefault 何使用 Linq 使用 | 更新日期: 2023-09-27 17:58:10

我的实际应用程序问题看起来与下面的完全一样

Employee empl = new Employee(397947, "David", "Redson", 80000);
        employees.Add(empl);
        employees.Add(new Employee(174966, "Alfred", "Swanson", 50000));
        employees.Add(new Employee(848024, "Alima", "Bieyrou", 40000));
        employees.Add(new Employee(number: 397462, fName: "Robert",
                                     lName: "Nants", salary: 30000));

string s = employees.Where(a => a.EmployeeNumber == 20000).FirstOrDefault().FirstName;

由于我使用FirstOrDefault,当没有匹配的记录时,它会抛出错误。如果有匹配的记录,我想返回值,否则它可以为null或空。。

如何使用Linq使用FirstOrDefault处理NULL对象属性

您不需要使用WhereFirstOrDefault。在这种情况下,您可以在FirstOrDefault本身内部指定筛选条件。但是,如果没有满足条件的记录,它会给你null(因为在没有第一个值的情况下,它会为你提供默认值,对于引用类型的对象,默认值是null),你应该在访问该值之前检查null,这将抛出NullReferenceException。所以这样使用:

var Employee=employees.FirstOrDefault(a => a.EmployeeNumber == 20000);
if(Employee!=null)
{
  string employee_name=Employee.FirstName;
  // code here
}

或者,您可以使用?.检查null,如下所示:

string employee_name = employees.FirstOrDefault(a => a.EmployeeNumber == 20000)?.FirstName;

在FirstOrDefault之前的linq语句中选择字符串,您将获得您的字符串或默认字符串:

string s = employees.Where(a => a.EmployeeNumber == 2000)
                    .Select(a => a.FirstName)
                    .FirstOrDefault();

这样做的优点是,只会提取您将要使用的值,而不会提取完整的Employee。

也许你可以尝试使用null传播来简化它:

string s = employees.Where(a => a.EmployeeNumber == 20000).FirstOrDefault()?.FirstName;

C# 8和更高版本中,使用null-coalescing运算符??和空校验运算符?

像这样:

string s = employees?.Where(a => a.EmployeeNumber == 20000)
                     .FirstOrDefault()?
                     .FirstName ?? string.Empty;

避免employees列表和任何员工属性中出现任何空异常。

您可以使用DefaultIfEmpty。考虑以下示例:

var entries = new Employee[0];
var result = entries.DefaultIfEmpty(new Employee() { FirstName = "<default name>" }).First().FirstName;

我认为最简单的方法就是写下一行:

string firstName = employees?.FirstOrDefault(a => a.EmployeeNumber == 20000)?.FirstName ?? null;

代码的作用是:如果employees不是null,并且它在employees的列表中找到了一个对象,其中EmployeeNumber等于20000,如果这个实例不为null,那么您将获得FisrtName属性,否则字符串firstName将为null。

如果您确定对于给定的EmployeeNumber只有一条记录,则可以使用SingleOrDefault扩展。

var item = employees.SingleOrDefault(a => a.EmployeeNumber == 20000);
string s = "";
if(item!= null)
{
    s = item.FirstName;
    // your logic ... 
}

如果给定employeenumber有多条记录,请使用FirstOrDefault,但在访问属性之前进行null检查。

var item = employees.FirstOrDefault(a => a.EmployeeNumber == 20000);
string s = "";    
if(item!= null)
{
    s = item.FirstName;
    // your logic ... 
}

你可以在下面这样做

var employee = employees.FirstOrDefault(a => a.EmployeeNumber == 20000);
return employee != null ? employee.Name : string.Empty;

在检查对象是否为null后赋值。

var emp = employees.Where(a => a.EmployeeNumber == 20000).FirstOrDefault();
string s = emp == null ? string.Empty: emp.FirstName;
string employee_name = employees.FirstOrDefault(a => a.EmployeeNumber == 20000)??new Employee();

我们可以使用它来避免在未创建和对象时出现null异常。

注意EFCore6+/EF7+,Queryable.FirstOrDefault方法返回序列的第一个元素或默认值。

不再返回NULL。检查是否未找到值:

  int e = integerReturningQuery.FirstOrDefault();
  if (e == default) //default for int is 0