Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 22h48   #1
Invité de passage
 
Inscription : septembre 2004
Messages : 8
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 8
Points : 3
Points : 3
Envoyer un message via MSN à Sharkus
Par défaut Création de requête dynamiquement via la classe System.LINQ.Dynamic sur fichier XML

Bonsoir à tous,
cela fait plusieurs jours que je cherches à créer une requette Linq to xml dynamiquement en fonction des critères définit par l'utilisateur.

J'ai trouvé la classe System.LINQ.Dynamic qui est sensée pouvoir le faire mais je ne parviens absolument pas à générer ma requete sur du xml ! Tous les exemples que je trouve son sur du linq to sql.

En bref je souhaite construire mes différentes clauses where via un string.

Voici mon code Linq actuel que je souhaite transformer en dynamic.
Code :
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
 
Dim docAnnonce As XDocument = <?xml version="1.0" encoding="utf-8"?>
                               <Diaporama>
                                   <annonce id="0">
                                       <mandat>1106ALX2150811</mandat>
                                       <titre>Corolla Verso</titre>
                                       <prix>14900,00</prix>
                                       <garantie/>
                                       <motorisation>Diesel</motorisation>
                                       <boiteVitesse>M</boiteVitesse>
                                       <DateImmat>28/02/2008 00:00</DateImmat>
                                       <kilometrage>58033</kilometrage>
                                       <couleur>Gris Clair</couleur>
                                       <nbportes>5</nbportes>
                                       <cvfiscaux>8</cvfiscaux>
                                       <puissancedin/>
                                       <options/>
                                       <lieu>NARBONNE</lieu>
                                       <nomgarage>Evolution Auto</nomgarage>
                                       <adresse>Rue E.Delamarre Deboutiville</adresse>
                                       <codepostal>11000</codepostal>
                                       <ville>NARBONNE</ville>
                                       <tel>04.68.42.29.00</tel>
                                       <images>
                                           <image>1293194A.jpg</image>
                                           <image>1293194B.jpg</image>
                                           <image>1293194C.jpg</image>
                                           <image>1293194D.jpg</image>
                                       </images>
                                   </annonce>
                                   <annonce id="1">
                                       <mandat>1106ALX2150811</mandat>
                                       <titre>Corolla Verso 1</titre>
                                       <prix>12400</prix>
                                       <garantie/>
                                       <motorisation>Essence</motorisation>
                                       <boiteVitesse>M</boiteVitesse>
                                       <DateImmat>23/01/2007 00:00</DateImmat>
                                       <kilometrage>89032</kilometrage>
                                       <couleur>Gris Clair</couleur>
                                       <nbportes>5</nbportes>
                                       <cvfiscaux>8</cvfiscaux>
                                       <puissancedin/>
                                       <options/>
                                       <lieu>NARBONNE</lieu>
                                       <nomgarage>Evolution Auto</nomgarage>
                                       <adresse>Rue E.Delamarre Deboutiville</adresse>
                                       <codepostal>11000</codepostal>
                                       <ville>NARBONNE</ville>
                                       <tel>04.68.42.29.00</tel>
                                       <tel>04.68.42.29.01</tel>
                                       <images>
                                           <image>1293194A.jpg</image>
                                           <image>1293194B.jpg</image>
                                           <image>1293194C.jpg</image>
                                           <image>1293194D.jpg</image>
                                       </images>
                                   </annonce>
                                   <annonce id="2">
                                       <mandat>1106ALX2150811</mandat>
                                       <titre>Corolla Verso 2</titre>
                                       <prix>14900,00</prix>
                                       <garantie/>
                                       <motorisation>Diesel</motorisation>
                                       <boiteVitesse>A</boiteVitesse>
                                       <DateImmat>28/02/2008 00:00</DateImmat>
                                       <kilometrage>58033</kilometrage>
                                       <couleur>Gris Clair</couleur>
                                       <nbportes>5</nbportes>
                                       <cvfiscaux>8</cvfiscaux>
                                       <puissancedin/>
                                       <options/>
                                       <lieu>NARBONNE</lieu>
                                       <nomgarage>Evolution Auto</nomgarage>
                                       <adresse>Rue E.Delamarre Deboutiville</adresse>
                                       <codepostal>11000</codepostal>
                                       <ville>NARBONNE</ville>
                                       <tel>04.68.42.29.00</tel>
                                       <images>
                                           <image>1293194A.jpg</image>
                                           <image>1293194B.jpg</image>
                                           <image>1293194C.jpg</image>
                                           <image>1293194D.jpg</image>
                                       </images>
                                   </annonce>
                                   <annonce id="3">
                                       <mandat>1106ALX2150811</mandat>
                                       <titre>Corolla Verso 3</titre>
                                       <prix>1490</prix>
                                       <garantie/>
                                       <motorisation>Essence</motorisation>
                                       <boiteVitesse>M</boiteVitesse>
                                       <DateImmat>28/02/2008 00:00</DateImmat>
                                       <kilometrage>58033</kilometrage>
                                       <couleur>Gris Clair</couleur>
                                       <nbportes>5</nbportes>
                                       <cvfiscaux>8</cvfiscaux>
                                       <puissancedin/>
                                       <options/>
                                       <lieu>NARBONNE</lieu>
                                       <nomgarage>Evolution Auto</nomgarage>
                                       <adresse>Rue E.Delamarre Deboutiville</adresse>
                                       <codepostal>11000</codepostal>
                                       <ville>NARBONNE</ville>
                                       <tel>04.68.42.29.00</tel>
                                       <images>
                                           <image>1293194A.jpg</image>
                                           <image>1293194B.jpg</image>
                                           <image>1293194C.jpg</image>
                                           <image>1293194D.jpg</image>
                                       </images>
                                   </annonce>
                               </Diaporama>
 
Dim ann = From d In docAnnonces...<annonce> _
              Where d.<nbportes>.Value = "4" _
              Let annonceID As Integer = d.@<id> _
              Let ordre As Integer = d.<ordre>.Value _
              Let datedebut = d.<datedebut>.Value _
              Let datefin = d.<datefin>.Value _
              Let theme = d.<theme>.Value _
              Let ecran As Integer = d.<ecran>.Value _
              Let repet As Integer = d.<repetition>.Value _
              Let photos = d.<images>.Value _
              Order By ordre Ascending
Voici les site que j'ai trouvé qui parle du sujet mais impossible de trouver la bonne syntaxe !
http://kenanbek.com/site/post/dynami...xt-at-runtime/
http://weblogs.asp.net/scottgu/archi...y-library.aspx

Quelqu'un à t il déjà exploré le sujet ? Help me please c'est super important et je nage complètement là

Merci d'avance
Sharkus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 11h26   #2
Nouveau Membre du Club
 
Homme Alex Hu
Développeur Java
Inscription : août 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Alex Hu
Localisation : Chine

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : août 2011
Messages : 15
Points : 25
Points : 25
Bonjour Sharkus,

C'est très difficile.
Tu as utilisé une drôle forme de LinqToXML en VB.NET. Cette forme n'est pas supporté par ces deux composant. Tu as besoin de les étendre.
J'ai écrit des codes pour te donner du allusion.
Tu peut remplacer
Code :
1
2
3
 
Dim ann = From d In docAnnonce...<annonce> _
  Where("@id.Value = ""1"" And <prix>.Value = ""12400""") _
par
Code :
1
2
 
Dim ann = docAnnonce.Where()
et
Code :
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
 
//Je suis désolé, c'est C#
using System.Linq.Expressions;
using System.Xml.Linq;
 
namespace MyLinqTest
{
    public static class XDynamic
    {
        public static IQueryable<XElement> Where(this XDocument xdoc)
        {
            IQueryable<XElement> query
                = xdoc.Element("Diaporama").Elements("annonce").AsQueryable();
 
            Type sorceType = query.ElementType;
            ParameterExpression p = Expression.Parameter(sorceType);
 
            Expression parameterValue = Expression.Constant(XName.Get("id"));
            Expression left = Expression.Call(p, "Attribute", null, parameterValue);
            left = Expression.Property(left, "Value");
            left = Expression.Equal(left, Expression.Constant("1"));
 
            parameterValue = Expression.Constant(XName.Get("prix"));
            Expression right = Expression.Call(p, "Element", null, parameterValue);
            right = Expression.Property(right, "Value");
            right = Expression.Equal(right, Expression.Constant("12400"));
 
            Expression body = Expression.And(left, right);
            LambdaExpression condition = Expression.Lambda(body, p);
 
            return query.Where(condition as Expression<Func<XElement, bool>>);
        }
    }
}
Alex Hu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 21h55   #3
Membre expérimenté
 
Homme Gilles Vino
Software Developer
Inscription : mars 2008
Messages : 505
Détails du profil
Informations personnelles :
Nom : Homme Gilles Vino
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Software Developer

Informations forums :
Inscription : mars 2008
Messages : 505
Points : 514
Points : 514
Tu trouvera ta réponse sur dotnet france

Pourquoi ne fait-tu pas:
Code :
1
2
3
4
5
6
Dim ann = From d In docAnnonces.Diaporama.annonce _
              Where d.@nbportes = "4" _
              Order By ordre Ascending
 
For Each(annonce as XElement in ann)
MessageBox.Show("ID=" + annonce.@id + ", Ordre=" + annonce.@ordre + "...")
EN VB cela est tres simple contrairement au C# qui n'est pas aussi avancé en ce domaine.

Visual Studio peux aussi te proposer tes noeuds XML et tes attributs a chaque fois que tu appuie sur la touche "." (intellisense) si tu référence ton fichier. Cela te simplifira grandement les choses sont la structure de ton document xml est figée, et cela t'aidera a mieux débuter.

Bon courage.
alex_vino est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h26.


 
 
 
 
Partenaires

Hébergement Web