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

时间:2016-07-21 05:35:35

标签: c# entity-framework linq

我的真实应用程序问题与下面的内容完全相同

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或空..

9 个答案:

答案 0 :(得分:21)

在这种情况下,您无需使用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;

答案 1 :(得分:21)

在FirstOrDefault之前选择linq语句中的字符串,然后获取字符串或默认字符串:

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

这不会将完整的员工转移到本地,而只会转移到FirstName,这是您想要的唯一字段。

答案 2 :(得分:4)

可能您可以尝试使用空传播来简化:

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

答案 3 :(得分:2)

如果您确定某个EmployeeNumber只有一条记录,则可以使用SingleOrDefault扩展名。

var item = employees.SingleOrDefault(a => a.EmployeeNumber == 20000);
string s = "";

if(item!= null)
{
    s = item.FirstName;
    // your logic ... 
}

如果给定的employeesenumber有多个记录,请使用FirstOrDefault但在访问属性之前进行空检查。

var item = employees.FirstOrDefault(a => a.EmployeeNumber == 20000);

string s = "";    
if(item!= null)
{
    s = item.FirstName;
    // your logic ... 
}

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

你可以这样做

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

答案 6 :(得分:0)

检查对象是否为空后分配值。

var emp = employees.Where(a => a.EmployeeNumber == 20000).FirstOrDefault();

string s = emp == null ? string.Empty: emp.FirstName;

答案 7 :(得分:0)

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

我们可以使用它并避免在未创建和对象时发生空异常。

答案 8 :(得分:0)

C# 8 和更高版本中使用 null-coalescing 运算符 ?? 和空检查运算符 ?

像这样:

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

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