web-dev-qa-db-fra.com

Comment gérer la propriété d'objet NULL avec FirstOrDefault à l'aide de Linq

mon vrai problème d'application ressemble exactement à ci-dessous

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;

Comme j'utilise FirstOrDefault, cela génère une erreur lorsqu'il n'y a pas d'enregistrement correspondant. S'il y a un enregistrement correspondant, je veux retourner la valeur, sinon elle peut être nulle ou vide.

13
python

Vous n'avez pas besoin d'utiliser Where et le FirstOrDefault dans ce cas, vous pouvez spécifier la condition de filtre à l'intérieur du FirstOrDefault lui-même. Mais ce qui vous donnera null s'il n'y a pas d'enregistrements remplissant la condition (car en l'absence de première valeur, il vous donnera la valeur par défaut, pour les objets de type référence, la valeur par défaut est null), vous devriez vérifier pour null avant d'accéder à la valeur, ce qui lancera NullReferenceException . Donc, utilisez comme ceci:

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

Sinon, vous pouvez utiliser ?. pour rechercher null comme ceci:

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

Sélectionnez la chaîne dans votre instruction linq avant votre FirstOrDefault et vous obtenez votre chaîne ou la chaîne par défaut:

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

Cela ne transférera pas l'employé complet vers le local, mais uniquement le prénom, qui est le seul champ que vous souhaitez.

27
Harald Coppoolse

Peut-être que vous pouvez essayer d'utiliser la propagation nulle pour le rendre plus facile:

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

Vous pouvez utiliser DefaultIfEmpty . Prenons l'exemple suivant:

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

Si vous êtes sûr que vous n'avez qu'un seul enregistrement pour une EmployeeNumber donnée, vous pouvez utiliser l'extension SingleOrDefault.

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

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

Si vous avez plusieurs enregistrements pour un numéro d'employé donné, utilisez FirstOrDefault mais effectuez une vérification nulle avant d'accéder aux propriétés.

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

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

vous pouvez faire comme ci-dessous

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

Attribuez une valeur après avoir vérifié si l'objet est nul.

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

string s = emp == null ? string.Empty: emp.FirstName;
0
Vivek.Shr