Supposons que j'ai une liste d'employés et que chaque employé a plusieurs projets. Je peux obtenir un employé donné en utilisant:

var employee = employees.SingleOrDefault(x => x.Id == "id");

Mais comment puis-je filtrer également le projet pour l'employé?

Par exemple:

var employee = list
  .SingleOrDefault(x => x.Key == employeeKey && 
                        x.Projects.SingleOrDefault(p => p.Key == projectKey));
3
Dino 20 nov. 2018 à 12:20

4 réponses

Meilleure réponse

Si vous souhaitez filtrer le Projects après avoir obtenu l'employé, vous pouvez utiliser un .Select().

var result = employees.Where(e => e.Id == id).Select(e => new Employee
            {
                Id = e.Id,
                Projects = e.Projects.SingleOrDefault(p => p.Key == projectKey)
            }).SingleOrDefault();

Ainsi, vous pouvez obtenir les données dont vous avez besoin en une seule étape, mais vous devez attribuer les propriétés vous-même.

Une autre façon consiste à obtenir d'abord votre Employee, puis à filtrer les projets, comme BoredomOverload l'a suggéré:

var employee = employees.SingleOrDefault(x => x.Id== "id");
employee.Projects = employee.Projects.SingleOrDefault(p => p.Key == projectKey);

Dans les deux cas, vous filtrez l'employé et les projets de cet employé.

2
RedFox 20 nov. 2018 à 09:42

var employee = employees.SingleOrDefault( x => x.Id.Equals("id") && x.project.Equals("project") );

0
user3261186 20 nov. 2018 à 09:24

Utilisez la méthode Any() LINQ comme

var employee = employees.SingleOrDefault(x => x.Id== "id" && x.Projects.Any(p => p.Id == "Id"));

De plus, vous filtrez en fonction de l'identifiant d'employé x.Id== "id" et surtout que l'identifiant d'employé serait une clé primaire (unique par nature) et dans ce cas, un filtrage juste par Id serait bien suffisant, je crois

0
Rahul 20 nov. 2018 à 09:33

SingleOrDefault renvoie l'objet s'il est trouvé ou nul. Donc, dans votre cas, cela renvoie tous les employés parce que vous ne testez rien. Vous venez de dire que si le projet existe, renvoyez-le.

Utilisez plutôt Any qui renverra une valeur booléenne si elle existe ou non:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Any(p => p.Key == projectKey));

Si vous avez besoin de filtrer s'il n'a qu'un seul projet avec la clé spécifique:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Count(p => p.Key == projectKey) == 1);

Vous pouvez également y parvenir avec SingleOrDefault mais tester la valeur avec null:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.SingleOrDefault(p => p.Key == projectKey) != null);

Si vous souhaitez que le type de retour soit plus spécifique, utilisez la commande select.

Si cela ne fonctionne pas, essayez d'ajouter "inclure" à la liste:

list.Include("Projects").... the rest of the query
0
Samy Sammour 20 nov. 2018 à 09:52