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 XML => Aide sur une requête


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de scharly3
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2008
    Messages : 121
    Par défaut Linq to XML => Aide sur une requête
    Bonjour,

    J'ai un petit problème avec une requête Linq To XML,

    Voici le contenu de mon fichier XML:

    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
    17
    18
    19
     
    <DocumentElement width="500" height="300">
     <row name="Online" filter="fiscalYear:FY11-Q2">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
     <row name="FPP" filter="fiscalYear:FY11-Q2">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
     <row name="Online"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
     <row name="FPP"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
    </DocumentElement>
    Aujourd'hui je veux récupérer mes données en fonction de l'attribute Filter.
    Pour ce faire je récupére toutes mes données avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myDatas = from i in sheets.Descendants()
                                                select i;
    Et filtre en parcourant mes XElement avec de nombreux IF ... Else...

    Je voudrais filtrer directement dans ma requête LINQ mais je n'y parvient pas, voici ce que je voudrais obtenir si je passe "FiscalYear:FY11-Q1" en parametre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <row name="Online"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
     <row name="FPP"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>

    Merci pour votre aide.

  2. #2
    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 scharly3 Voir le message
    Pour ce faire je récupére toutes mes données avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myDatas = from i in sheets.Descendants()
                                                select i;
    Et filtre en parcourant mes XElement avec de nombreux IF ... Else...
    C'est à peu près la pire façon de faire, ça te renvoie une liste "plate" de tous les éléments, sans aucune structure ou hiérarchie...

    Personnellement je pense que la méthode Descendants ne devraient même pas exister, c'est une incitation à faire n'importe quoi

    Citation Envoyé par scharly3 Voir le message
    Je voudrais filtrer directement dans ma requête LINQ mais je n'y parvient pas, voici ce que je voudrais obtenir si je passe "FiscalYear:FY11-Q1" en parametre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <row name="Online"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
     <row name="FPP"  filter="fiscalYear:FY11-Q1">
      <Landing>40 000</Landing>
      <VTF>10 146</VTF>
     </row>
    Le plus simple (je suppose que sheets est le XDocument) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    myDatas =
        from row in sheets.Root.Elements("row")
        where row.Attribute("filter").Value == "FiscalYear:FY11-Q1"
        select row;

  3. #3
    Membre éprouvé Avatar de scharly3
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2008
    Messages : 121
    Par défaut
    En effet, je ne doute pas qu'il s'agissait là de la plus mauvaise façon de procéder, sheets est un XElement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XElement sheets = XElement.Load(UrlFile);
    Je vais voir pour le passe en Xdocument et traiter ce que tu viens de me donner.

    Merci beaucoup.

  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
    Citation Envoyé par scharly3 Voir le message
    Je vais voir pour le passe en Xdocument et traiter ce que tu viens de me donner.
    Te fatigue pas, enlève juste le ".Root" du code que je t'ai donné et ça devrait être bon

  5. #5
    Membre éprouvé Avatar de scharly3
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2008
    Messages : 121
    Par défaut
    Hum je rencontre un problème tous de même, je vais coller le reste du code et tu comprendras tous de suite que tous le reste du code tourne autour du résultat d'un descendant().

    Si tu peux juste me donner une piste sur quel serait la meilleur solution (même s'il faut tous refaire...) j'avoue avoir pris la piste qui me semblait la plus simple de prime abord ...

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
           public IEnumerable<IDictionary> GenerateData(string filter)
            {
                //Selection du fichier XML
                //XDocument sheets = XDocument.Load(UrlFile);
                XElement sheets = XElement.Load(UrlFile);
                IEnumerable<XElement> myDatas;
                //Select Datas
                if (filter != null)
                {
                    myDatas = from row in sheets.Elements("row")
                              //where row.Attribute("filter").Value == "FiscalYear:FY11-Q1"
                              select row;
                }
                else
                {
                    myDatas = from i in sheets.Descendants()
                              select i;
                }
     
                Dictionary<string, object> dict = new Dictionary<string, object>();
                int count = 0;
                float valeur;
                //Fill Rows and Cols
                foreach (XElement e in myDatas)
                {
                    MessageBox.Show(e.Name.LocalName);
                    //if we are looking at row node
                    if (e.Name.LocalName == "row")
                    {
     
                        if (count != 0)
                        {
                            yield return dict;
                            dict = new Dictionary<string, object>();
                        }
                        dict["Description"] = (string)e.Attribute("name");
     
                    }
                    else
                    {
                        if (float.TryParse(e.Value, out valeur))
                        {
                            dict[(string)e.Name.LocalName] = valeur;
                        }
                        else
                        {
                            dict[(string)e.Name.LocalName] = e.Value;
                        }
                    }
                    count++;
     
     
                }
                yield return dict;
            }

  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
    OK, donc si je comprends bien, tu veux renvoyer, pour chaque élément row, un dictionnaire avec :

    Description = (attribut name)
    Landing = (element Landing)
    VTF = (element VTF)

    C'est bien ça ?

    Moi je ferais quelque chose comme ça :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    public IEnumerable<IDictionary> GenerateData(string filter)
    {
        XElement sheets = XElement.Load(UrlFile);
     
        return
            from row in sheets.Elements("row")
            where row.Attribute("filter").Value == filter
            select MakeDictionary(row);
    }
     
    IDictionary MakeDictionary(XElement row)
    {
        var dict = row.Elements().ToDictionary(e => e.Name.LocalName, ParseValue);
        dict.Add("Description", row.Attribute("name").Value);
        return dict;
    }
     
    object ParseValue(XElement e)
    {
        float value;
        if (float.TryParse(e.Value, out value))
            return value;
        return e.Value;
    }
    Ca donne les résultats suivants :

    Landing = 40000
    VTF = 10146
    Description= Online

    Landing = 40000
    VTF = 10146
    Description = FPP

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

Discussions similaires

  1. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  2. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  3. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29
  4. Aide sur une requête
    Par TshAw dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2005, 11h42
  5. Aide sur une requête (Group By...??)
    Par Cocolapin dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/12/2004, 10h26

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