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

Framework .NET Discussion :

[LINQ] Additionner plusieurs QUERY


Sujet :

Framework .NET

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut [LINQ] Additionner plusieurs QUERY
    Bonjour à tous,

    Je dispose de plusieurs requetes LINQ qui me renvoi la meme structure.
    Comment additionner ou fusionner ces "résultats" ?
    De plus, j'ai un probleme de déclaration de variable (cf plus bas).

    Pour donner une idée plus clair de ce que je veux faire, voici un ex completement inventé, mais qui résume bien ce que j'aimerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var QUERY1 = from aTest in db.MyTest where aTest.Name == "One Name" select aTest ;
    if (MONTEST)
    var QUERY2 = from aTest in db.MyTest where aTest.Name == "Second Name" select aTest ;
     
    var QUERY = QUERY1 + QUERY2 ;
    1/ QUERY2 n'est pas connu en dehors du if (normal me direz vous), mais comment la déclarer en dehors du if puisque "var QUERY2 = null;" voir "var QUERY2 = new var;" ou quelque chose du genre est impossible ?

    2/ Comment ajouter mes deux QUERY dans un QUERY finale ?

    Merci de me donner ne serait-ce qu'une piste

    Bertrand

  2. #2
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var QUERY1 = from aTest in db.MyTest where aTest.Name == "One Name" select aTest ;
    if (MONTEST)
    var QUERY2 = from aTest in db.MyTest where aTest.Name == "Second Name" select aTest ;
    
    var QUERY = QUERY1.Union(QUERY2) ;
    A tester

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Merci, ca a l'air de fonctionner !
    Une idée pour la déclaration du 'var' svp ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Si tu connais le type de ATest (disons que c'est T), tu peux déclarer query1 et query2 comme IEnumerable<T>
    Personnellement je n'utilise pas trop la notion de "var", je préfère manipuler des objets fortement typés

  5. #5
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Si tu connais le type de ATest (disons que c'est T), tu peux déclarer query1 et query2 comme IEnumerable<T>
    Personnellement je n'utilise pas trop la notion de "var", je préfère manipuler des objets fortement typés
    var est typé. Il référence un objet typé si ce n'est qu'on ne déclare pas l'objet préalablement

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Ditch Voir le message
    var est typé. Il référence un objet typé si ce n'est qu'on ne déclare pas l'objet préalablement
    Certes... mais ce n'est pas un type auquel tu peux faire référence, ce qui, dans le cas présent, pose problème puisqu'on ne peut pas déclarer la variable puis l'initialiser dans le if

  7. #7
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Et non, je ne peux pas "typer" mon var puisque la structure est construite dynamiquement par LINQ...
    C'est quand meme étonnant que M$ n'est pas pensé à cela !

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Firedeal Voir le message
    Et non, je ne peux pas "typer" mon var puisque la structure est construite dynamiquement par LINQ...
    C'est quand meme étonnant que M$ n'est pas pensé à cela !
    Ben tu connais le type des éléments de db.MyTest, non ? Mon petit doigt me dit que c'est une table généré par le designer Linq to SQL Classes... et donc de type Table<UnType>.
    Donc, vu ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from aTest in db.MyTest ... select aTest ;
    tu peux être sûr qu'elle te renverra des objets de type UnType, et donc que le résultat implémentera IEnumerable<UnType>.

    Donc tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IEnumerable<UnType> QUERY1 = from aTest in db.MyTest where aTest.Name == "One Name" select aTest ;
    IEnumerable<UnType> QUERY2 = null;
    if (MONTEST)
        QUERY2 = from aTest in db.MyTest where aTest.Name == "Second Name" select aTest ;
     
    IEnumerable<UnType> QUERY;
    if (QUERY2 != null)
        QUERY = QUERY1.Union(QUERY2) ;
    else
        QUERY = QUERY1;

  9. #9
    Expert confirmé
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Certes... mais ce n'est pas un type auquel tu peux faire référence, ce qui, dans le cas présent, pose problème puisqu'on ne peut pas déclarer la variable puis l'initialiser dans le if
    Effectivement, on ne parle pas exactement de la même chose. Je rejoins donc la solution du dernier post. Désolé j'ai coupé court à la réponse mais cela ne correspond pas tout à fait.

    Par contre, tu pourrais faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var QUERY1 = (from aTest in db.MyTest where aTest.Name == "One Name" select aTest).Union(from aTest in db.MyTest where aTest.Name == "Second Name" && MONTEST=true select aTest) ;
    Dans ce cas, on tient compte du test et on ne renvoie pas non plus trop d'informations. Là c'est juste pour gagner des lignes de code

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bien vu

  11. #11
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben tu connais le type des éléments de db.MyTest, non ? Mon petit doigt me dit que c'est une table généré par le designer Linq to SQL Classes... et donc de type Table<UnType>.
    Et non je ne le connais pas parceque je fais un "join" entre plusieurs tables, et je récupere seulement les informations qui m'interesse. Le type ne correspond donc pas à une des classes générées par le designer (à une table quoi).


    Citation Envoyé par Ditch Voir le message
    Par contre, tu pourrais faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var QUERY1 = (from aTest in db.MyTest where aTest.Name == "One Name" select aTest).Union(from aTest in db.MyTest where aTest.Name == "Second Name" && MONTEST=true select aTest) ;
    Dans ce cas, on tient compte du test et on ne renvoie pas non plus trop d'informations. Là c'est juste pour gagner des lignes de code
    Ho, pas mal cette idée !! Jvais la creuser et voir si je peux l'adapter à mon besoin !

Discussions similaires

  1. Attendre la fin de plusieurs Query(web) pour continuer?
    Par Dantore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/08/2009, 17h05
  2. Réponses: 12
    Dernier message: 23/04/2009, 14h53
  3. Réponses: 5
    Dernier message: 20/10/2008, 10h07
  4. Possible d'optimiser (Plusieurs querys en 1 seule)??
    Par MadCat34 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2005, 16h25
  5. Qreport avec groupe et plusieurs query
    Par Oluha dans le forum Bases de données
    Réponses: 14
    Dernier message: 17/11/2005, 11h16

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