IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Equivalent NOT IN avec LINQ


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Equivalent NOT IN avec LINQ
    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.

  2. #2
    Membre chevronné
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Par défaut
    La clause IN n'est pas supporté par l'entity framework. Tu peux réaliser une requête de ce style avec Linq mais pas avec Linq To Entity

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 28
    Par défaut
    Salut,

    Une méthode qui reviendrai au même résultat serait de créer deux query, une qui récupère tous les id valides (DBO.EMPLOYE) et une deuxième liste qui contient les id à enlever (DBO.EMPSERV).

    Par Exemple, en supposant que ta table EMPSERV contient elle aussi le nom et prénom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var _IdValid = DBO.EMPLOYE.Where(emp => emp.DES_EMP.Equals("DUPONT") && EMP.PRENOM_EMP.Equals("ROBERT")).Select(emp => emp.ID_EMP);
     
    var _IdExecpt = DBO.EMPSERV.Where(es => ES.DSORT_ES == null && es.NOM.Equals("DUPONT") && ES.PRENOM.Equals("ROBERT")).Select(es => ES.IDEMP_ES);
     
    var queryfinal = _IDValid.Execpt(_IDExecpt); 
    // queryfinal correspond à la liste des id Valide moins celle des Id non Valide
    // Ce qui si je me trompe pas équivalent à une requête NOT IN
    Si, tu n'a pas le nom et prénom dans DBO.EMPSERV une requête imbriqué pour récupéré le numéro de l'ID pourrait faire l'affaire.

Discussions similaires

  1. Command not found avec csh
    Par mavina dans le forum Linux
    Réponses: 2
    Dernier message: 25/04/2006, 13h47
  2. Equivalent à FLASH avec support Action Script
    Par HNT dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 11/01/2006, 16h42
  3. Opérateur not ? Bug avec MinGW 3.4 ? ou mot clé ?
    Par Groove dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 31/01/2005, 18h05
  4. Equivalent IN ms avec un ET au lieu du OU ds la lste
    Par Pompil dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/03/2004, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo