Bonjour à tous,

J'ai besoin de réaliser avec LINQ l'équivalent d'une requête SQL avec une clause NOT IN.

Voici la requête SQL en question :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    EMP.ID_EMP
FROM 
    DBO.EMPLOYE EMP
WHERE
    EMP.DES_EMP = 'DUPONT'
    AND EMP.PRENOM_EMP = 'ROBERT'
    AND EMP.ID_EMP NOT IN (
                     SELECT 
                             ES.IDEMP_ES
                     FROM
                             DBO.EMPSERV ES
                     WHERE
                             ES.IDEMP_ES = EMP.ID_EMP
                             AND ES.DSORT_ES IS NULL
                          )
Cette requête SQL fonctionne parfaitement. A titre informatif, il y a donc une table Employe, une table EmpServ et une table Service. La table EmpServ contient l'id de l'employe, l'id du serv, une date d'entrée et une date de sortie (on a donc un histoire des changements de service).

Le but est de faire une recherche afin de savoir si une personne dont on connait le nom et le prenom (sans être sur qu'elle existe déjà dans la table employe) est actuellement dans un service.

J'ai donc essayé de faire l'équivalent en LINQ :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
MesEntities entities = new MesEntities();
var result = from emp in entities.employe
                 where !(from es in entities.empserv
                             where es.DSort_ES == null
                             select es.employe.ID_Emp)
                        .Contains(emp.ID_Emp)
                        && emp.Des_Emp.Trim().Equals(leNom.Trim())
                        && emp.Prenom_Emp.Trim().Equals(lePrenom.Trim())
                 select emp;
Mais j'ai une erreur à chaque fois. Et je comprend pas trop pourquoi. Pour faire ma requete, je me suis inspiré de cet exemple : http://programminglinq.com/blogs/mar...nq-to-sql.aspx

J'ai aussi essayé de faire comme ceci mais j'ai aussi une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
var esResult = from es in entities.empserv
                    where es.DSort_ES == null
                    select es.employee.ID_Emp;
 
var empResult = entities.employe.Where(emp => esResult.Contains(emp.ID_Emp));
Merci d'avance pour votre aide.