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 :

Linq To Entities : Problème sur une requête


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Linq To Entities : Problème sur une requête
    Bonjour à tous,

    Je rencontre un problème pour réaliser une requête avec LINQ To Entities avec un Left Outer Join. Je vous explique le contexte. J’ai une table Client dans laquelle on trouve diverses infos (nom, …). Il a ensuite une table Contrat avec, là aussi, quelques informations (ref du contrat, …). Entre les deux, une table Souscription qui fait office d’intermédiaire. Elle contient une Date de souscription, une date de résiliation.

    Un client peut donc souscrire à 0, 1 ou plusieurs contrats et on garde l’historique de ses anciennes souscriptions.



    Mon objectif est de ressortir la liste complète des Clients avec le/les souscriptions actuelles (avec une Date de résiliation à null ou supérieure à la date du jour). Je dois bien évidemment récupérer les clients qui n’ont pas de souscriptions (soit car toutes les Souscriptions ont une date de résiliation passée, soit car il n’y a encore rien dans cette table).

    La requête SQL pour faire cela est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
    	*
    FROM dbo.Client CLI
    	LEFT OUTER JOIN dbo.Souscription SOU ON CLI.IdCli = SOU.IdCliAND (SOU.DtResilitation IS NULL OR SOU.DtResiliation > CURRENT_TIMESTAMP)
    Rien de bien compliqué donc.

    Mais pour faire cela en Linq to Entities, c’est beaucoup plus difficile. J’ai tout essayé sans succés. A chaque fois, il me manque des clients (ceux qui n’ont aucune donnée dans la table Souscription par exemple).

    Comment faire une telle requête ?

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai pas testé mais t'as essayé ça

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var query = from clt in context.Clients
                    join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
                    where sub.DtResiliation > DateTime.Now
                    from cltsub in ClientWithSubs.DefaultIfEmpty()
                    select cltsub;

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Malheureusement, cette requête ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var query = from clt in context.Clients
    join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
    where sub.DtResiliation > DateTime.Now
    Dans le where, on a pas accés à "sub". On peut seulement utiliser "ClientWithSubs".

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ah ouais je vois.

    Mais as-tu pensé à avoir deux requêtes linq séparées. l'une avec les clients ayant les souscription avec ta condition et l'autre sans.
    Une troisième a exécuter pour faire l'union des deux précédentes.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Sinon je viens de lire une discussion où iberserk proposait pour un problème a peu près le même de passer par une vue.

    Etant donné que ta requête T-SQL te permet d'avoir ce que tu veux de façon très simple pourquoi ne pas créer une vue pour celle-ci et importer la vue dans ton modèle EDM.

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Sinon je viens de lire une discussion où iberserk proposait pour un problème a peu près le même de passer par une vue.
    Merci pour la pub

    Vous pouvez aussi passer par une fonction table (SQL)si vous le souhaitez.

    La fonction table est IQUERYABLE contrairement à la procédure stockée et peu accepter des paramètres.
    pour exemple vous pourriez arriver à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var result=context.FN_GET_CLIENTS_WITH_CONTRACTS(DateTime.Now());
    Sinon en LINQ celà ne fonctionne pas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var query = from clt in context.Clients
                    join sub in context.Souscriptions on clt.IdCli equals sub.IdCli into ClientWithSubs
                    select ClientWithSubs.DefaultIfEmpty().Where(a=>a.DtResiliation > DateTime.Now or a.DtResiliation  ==null);

Discussions similaires

  1. problème sur une requête imbriquée
    Par pbatty1 dans le forum Requêtes
    Réponses: 12
    Dernier message: 26/10/2007, 17h21
  2. problème sur une requête mysql
    Par atomikado dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2007, 16h04
  3. [Optimisation] Problème sur une requête UNION.
    Par françois62 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/06/2005, 16h08
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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