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 :

problème de jointures multiple et problème sur CopyToDataTable


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut problème de jointures multiple et problème sur CopyToDataTable
    Bonjour,

    Je n'arrive pas à trouver un exemple (clair pour moi en tout cas) afin de faire plus d'une jointure sur deux tables d'un DataSet.

    En effet, je déclare mes deux DataTable comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DataTable dtImbalance = new DataTable();
    DataTable dtImbalanceDetail = new DataTable();
     
    dtImbalance = ...DataSource.Tables["Imbalance"];
    dtImbalanceDetail = ...DataSource.Tables["ImbalanceDetail"];
    Ensuite, j'ai trouvé cela pour faire avec une jointure:
    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
     
    EnumerableRowCollection<DataRow> imbalances = dtImbalance.AsEnumerable();
    EnumerableRowCollection<DataRow> details = dtImbalanceDetail.AsEnumerable();
     
    var query =
                    from i in imbalances
                    join d in details
                       on i.Field<DateTime>("zzz") equals d.Field<DateTime>("zzz")
                    select new
                    {
                       aaa = i.Field<int>("aaa"),
                       bbb = i.Field<string>("bbb"),
                       ccc = d.Field<string>("ccc"),
                       ddd = d.Field<int>("ddd")
                    };
    Sauf qu'ici donc, ma jointure ne doit pas se faire uniquement sur "zzz", mais sur deux autres champs "yyy" et "xxx" tous deux contenus dans mes DataSet dtImbalance et dtImbalanceDetail.

    Ma première question donc : comment insérer mes deux jointures manquantes?

    Je veux ensuite récupérer le résultat de ma requête et j'ai trouvé ceci comme manière de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DataTable dtFinal = query.CopyToDataTable();
    Problème, ça ne compile pas, me disant que la méthode CopyToDataTable n'existe pas.

    Deuxième question donc : Pourquoi? et que dois-je modifier dans ma requête afin que cette méthode soit reconnue ou alors comment puis-je récupérer autrement le résultat de ma requête?

    Merci beaucoup pour votre aide,
    Julien

  2. #2
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    J'ai trouvé une réponse qui fait ce que je désire mais qui ne marche pas dans mon cas, je m'explique : Voilà la proposition:
    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
    var query =
                    from i in imbalances
                    join d in details
                       on new { i.zzz,
                                     i.yyy,
                                     i.xxx } 
                            equals new { d.zzz,
                                         d.yyy,
                                         d.xxx}
                    select new
                    {
                       aaa = i.Field<int>("aaa"),
                       bbb = i.Field<string>("bbb"),
                       ccc = d.Field<string>("ccc"),
                       ddd = d.Field<int>("ddd")
                    };
    Le problème, c'est que je n'ai pas accés directement à i.zzz ou d.zzz
    Et lorsque je remplace par exemple i.zzz par i.Field<DateTime>("zzz") ça ne compile pas plus.
    Je suis bloqué et je ne vois plus quoi essayer...
    D'avance merci donc pour votre éclairage,
    Julien

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    La manière de faire en VB à l'air d'être la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var query =
                    from i in imbalances
                    join d in details
                       on i.Field<DateTime>("zzz") equals d.Field<DateTime>("zzz")
               and i.Field<DateTime>("xxx") equals d.Field<DateTime>("xxx")
                    ...
    Mais ça ne compile pas en C#. J'ai essayé de remplacer le "and" par "&&", mais pas plus de résultat...

  4. #4
    Membre Expert
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Par défaut
    le and fait partie de la syntaxe linq, donc tu ne devrais pas avoir à le remplacer.

    As-tu un message d'erreur et si oui, lequel ?

    Pour la méthode CopyToDataTable, c'est une méthode d'extension pour les IEnumerable<T> où T est un DataRow : http://msdn.microsoft.com/fr-fr/library/bb396189.aspx

    Donc si tu ne sélectionne pas un DataRow, tu ne peux pas le faire.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  5. #5
    Membre éprouvé
    Avatar de jgard
    Profil pro
    Inscrit en
    Août 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 67
    Par défaut
    Non le "and" ne fonctionne pas en C# dans un join. Je vois juste une différence par rapport aux requêtes que je fais. Je donne un nom aux membres du new. Essaie comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var query =
                    from i in imbalances
                    join d in details
                       on new { Fields1 = i.zzz,
                                     Field2 = i.yyy,
                                     Field3 = i.xxx } 
                            equals new {Field1 = d.zzz,
                                         Field2 = d.yyy,
                                         Field3 = d.xxx}

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Bonjour jgard,
    Merci pour ta réponse.
    Le problème c'est que comme je disais mon i.zzz ou d.yyy par exemple ne sont pas reconnus, je ne peux pas appeller directement par le noms de mes colonnes, elles ne sont pas reconnues comme des attributs directs du DataSet, il semble que je doive passer par une écriture du genre i.Field<DateTime>("zzz")
    Pour info, le message d'erreur que j'ai quand j'utilise i.zzz est le suivant:
    Error 2 'System.Data.DataRow' does not contain a definition for 'zzz' and no extension method 'zzz' accepting a first argument of type 'System.Data.DataRow' could be found (are you missing a using directive or an assembly reference?) C:\Projets\...\DepositPositionImbalanceExterne.cs 43 36 ...Deposit
    Et le message d'erreur quand j'utilise une syntaxe comme i.Field<DateTime>("zzz") à la place est le suivant:
    Error 2 Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access. C:\Projets\...\DepositPositionImbalanceExterne.cs 64 25 ...Deposit

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Bonjour laedit,
    Merci pour ta réponse.
    Quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EnumerableRowCollection<DataRow> imbalances = dtImbalance.AsEnumerable();
    Je défini bien un DataRow justement, donc c'est pour ça que je ne comprends pas pourquoi je n'ai quand même pas accés à la méthode CopyToDataTable...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec jointures multiples.
    Par Veritas5 dans le forum Développement
    Réponses: 3
    Dernier message: 05/06/2009, 15h42
  2. [SQL2005][TSQL]Problème de jointures multiples
    Par Veritas5 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2009, 17h04
  3. Problème de jointure multiple
    Par Max_be dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2007, 21h39
  4. Problème de Jointure sur 2 tables
    Par Andry dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2006, 13h20
  5. problème requête à jointure multiple...
    Par Ricardo_Tubbs dans le forum Access
    Réponses: 6
    Dernier message: 09/02/2006, 16h45

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