Как обрабатывать свойство объекта NULL с помощью FirstOrDefault с использованием 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, он бросает ошибку, когда нет соответствующей записи. Если есть соответствующая запись, я хочу вернуть значение, иначе оно может быть пустым или пустым.

Ответ 1

Вам не нужно использовать Where и FirstOrDefault в этом случае вы можете указать условие фильтра внутри самого FirstOrDefault. Но это даст вам ноль, если нет записей, удовлетворяющих условию (потому что при отсутствии первого значения это даст вам значение по умолчанию, для объектов ссылочного типа значение по умолчанию равно 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;

Ответ 2

Выберите строку в своем выражении linq перед вашим FirstOrDefault, и вы получите строку или строку по умолчанию:

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

Это не будет передавать полный сотрудник на локальный, но только FirstName, который является единственным полем, которое вы хотите.

Ответ 3

Может быть, вы можете попробовать использовать нулевое распространение, чтобы упростить его:

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

Ответ 4

Если вы уверены, что у вас есть только одна запись для данного EmployeeNumber, вы можете использовать расширение SingleOrDefault.

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

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

Если у вас есть несколько записей для данного использования, используйте FirstOrDefault, но выполняйте нулевую проверку перед доступом к свойствам.

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

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

Ответ 5

Вы можете использовать DefaultIfEmpty. Рассмотрим следующий пример:

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

Ответ 6

вы можете сделать, как показано ниже

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

Ответ 7

Присвоить значение после проверки, является ли объект нулевым.

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

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