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

VB.NET Discussion :

Création de requêtes Linq dynamique [Débutant]


Sujet :

VB.NET

  1. #21
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    J'ai essayé d'utiliser le predicateBuilder (enfin le refaire en VB), mais j'arrive pas à avoir l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <System.Runtime.CompilerServices.Extension()>
    en VB

    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
    Imports System.Linq
    Imports System.Linq.Expressions
    Imports System.Collections.Generic
     
    Public NotInheritable Class PredicateBuilder
        Private Sub New()
        End Sub
        Public Shared Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) True
        End Function
        Public Shared Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) False
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Shared Function [Or](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[OrElse](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Shared Function [And](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[AndAlso](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
    End Class

  2. #22
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Bonjour, je vois pas spécialement où est la difficulté (bon j'ai un peu survolé le fil aussi )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Cas "Or"
    Dim orResults = db.database.Where(Function(a) tabMots.Any(Function(mot) a.unChamp.Contains(mot)))
     
    'Cas "And"
    Dim andResults = db.database.Where(Function(a) tabMots.All(Function(mot) a.unChamp.Contains(mot)))
    Ca marcherait si c'était du Linq to Objects, mais avec Entity Framework cette requête ne pourra pas être traduite en SQL...

    Citation Envoyé par patxy Voir le message
    J'ai essayé d'utiliser le predicateBuilder (enfin le refaire en VB), mais j'arrive pas à avoir l'équivalent de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <System.Runtime.CompilerServices.Extension()>
    en VB

    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
    Imports System.Linq
    Imports System.Linq.Expressions
    Imports System.Collections.Generic
     
    Public NotInheritable Class PredicateBuilder
        Private Sub New()
        End Sub
        Public Shared Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) True
        End Function
        Public Shared Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) False
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Shared Function [Or](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[OrElse](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Shared Function [And](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[AndAlso](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
    End Class
    Il faut utiliser Module au lieu de NotInheritable Class

  3. #23
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    J'allais justement te demander ce qu'était ce module

    http://msdn.microsoft.com/fr-fr/library/bb384936.aspx

    Je tente, je mange, je continue les tests et reviens vers vous.

    Un grand merci, ça commence à avancer!

  4. #24
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ca marcherait si c'était du Linq to Objects, mais avec Entity Framework cette requête ne pourra pas être traduite en SQL...
    Ah je trouve cela surprenant, a priori, sql étant un langage ensembliste, faire un all ou un any ne semble pas complexe (un "where machin exists in sous-requete" pour any par exemple) ; de même un string.Contains doit facilement se mapper sur un Like "%mot%"

    existe-t-il un lien, une documentation où connaître le détail de ces limitations, j'avoue mal connaître ce sujet ?

    Cordialement !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #25
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    Une simple requête telle que ceci fonctionne à merveille!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                Dim predicate1 = PredicateBuilder.False(Of meeting)()
                For Each mot In tabMot
                    predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(mot))
                Next
                Dim meetings = db.meeting.AsExpandable().Where(predicate1)
    Par contre, j'ai envie de corser un peu les choses.

    J'ai créé un tableau avec 10 Strings. (ces strings représentent les noms des colonnes de ma DB. (tabColumns)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
              Dim predicate5 = PredicateBuilder.False(Of contact)()
                For Each mot In tabMot
                    For Each column In tabColumns
                        predicate5 = predicate5.Or(Function(m) m.column.Contains(mot))
                    Next
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate5)
    Évidement, Table n'est pas un membre de la table contact.




    Autre chose. Ceci concerne un peu plus la logique de programmation.

    S'il faut que le programme me retourne toutes les entrées qui contiennent l'entièreté des mots introduits par l'utilisateur.

    La logique en français me semble être la suivante =

    (champ1 contient mot1 ou champ2 contient mot1 ou champ3 contient mot1) ET (champ1 contient mot2 ou champ2 contient mot2 ou champ3 contient mot2)
    Cela semble correct?

    (Je réfléchis à comment traduire ça en code)

    édit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              Dim predicate = PredicateBuilder.False(Of contact)()
                For Each mot In tabMot
                    if lien = "Or"
                        predicate = predicate.Or(Function(m) m.nom.Contains(mot))
                    End If
                    If lien = "And"
                        predicate = predicate.And(Function(m) m.nom.Contains(mot))
                    End If
                        predicate = predicate.Or(Function(m) m.prenom.Contains(mot))
                        predicate = predicate.Or(Function(m) m.qualifications.Contains(mot))
                        ...
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate)

  6. #26
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Ah je trouve cela surprenant, a priori, sql étant un langage ensembliste, faire un all ou un any ne semble pas complexe (un "where machin exists in sous-requete" pour any par exemple) ; de même un string.Contains doit facilement se mapper sur un Like "%mot%"
    Ce n'est pas Any ou All qui pose problème, c'est tabMots. C'est un tableau en mémoire, la DB n'y a pas accès... Les variables locales utilisées dans la requête sont normalement passées en paramètre, mais pour les tableaux ce n'est pas supporté

    Citation Envoyé par Sehnsucht Voir le message
    existe-t-il un lien, une documentation où connaître le détail de ces limitations
    Peut-être, mais je sais pas où...

    Citation Envoyé par patxy Voir le message
    J'ai créé un tableau avec 10 Strings. (ces strings représentent les noms des colonnes de ma DB. (tabColumns)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
              Dim predicate5 = PredicateBuilder.False(Of contact)()
                For Each mot In tabMot
                    For Each column In tabColumns
                        predicate5 = predicate5.Or(Function(m) m.column.Contains(mot))
                    Next
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate5)
    Évidement, Table n'est pas un membre de la table contact.
    Non, tu peux pas faire ça comme ça. C'est possible, mais c'est nettement plus compliqué (en gros il faut créer l'expression explicitement, via Expression.Property, Expression.Call, Expression.Lambda etc)


    Citation Envoyé par patxy Voir le message
    (champ1 contient mot1 ou champ2 contient mot1 ou champ3 contient mot1) ET (champ1 contient mot2 ou champ2 contient mot2 ou champ3 contient mot2)
    Cela semble correct?
    Oui

    Citation Envoyé par patxy Voir le message
    (Je réfléchis à comment traduire ça en code)

    édit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
              Dim predicate = PredicateBuilder.False(Of contact)()
                For Each mot In tabMot
                    if lien = "Or"
                        predicate = predicate.Or(Function(m) m.nom.Contains(mot))
                    End If
                    If lien = "And"
                        predicate = predicate.And(Function(m) m.nom.Contains(mot))
                    End If
                        predicate = predicate.Or(Function(m) m.prenom.Contains(mot))
                        predicate = predicate.Or(Function(m) m.qualifications.Contains(mot))
                        ...
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate)
    Je ferais plutôt ç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
              Dim predicate = PredicateBuilder.False(Of contact)()
                    Dim combination As Func(Of Expression(Of Func(Of Contact, Boolean)), Of Expression(Of Func(Of Contact, Boolean)), Of Expression(Of Func(Of Contact, Boolean)))
                    If lien = "And" Then
                        combination = PredicateBuilder.And
                    Else
                        combination = PredicateBuilder.Or
                    End If
     
                For Each mot In tabMot
                    predicate = combination(predicate, Function(m) m.nom.Contains(mot))
                    predicate = combination(predicate, Function(m) m.prenom.Contains(mot))
                    predicate = combination(predicate, Function(m) m.qualifications.Contains(mot))
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate)
    (j'avoue, la signature du delegate pour combination est assez monstrueuse )

  7. #27
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    édit :

    Le retour que j'ai de mes requêtes n'est pas correct. J'ai pas tous les résultats que je devrais avoir.

    J'ai 3 choix possible : chaine tel quelle, au moins 1 des mots, ou tous les mots.

    Si je fais une recherche sur une expression exacte, le retour est correcte.


    Si je fais une recherche sur un "au moins 1 des mots" avec 1 mot, le retour est correct.
    Si je mets plusieurs mots, il fonctionne comme un "ET". C'est comme si j'avais sélectionné "tous les mots".


    Si je fais 1 recherche sur "tous les mots", avec 1 seul mot, il ne retourne jamais rien.



    Voici le code du controleur
    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
    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
     
    Imports System.Data.Objects
    Imports System.Linq.Expressions
    Imports System.Linq
    Imports System.Collections.Generic
    Imports System
    Imports LinqKit
     
    Namespace MvcApplication4
        Public Class SearchController
            Inherits System.Web.Mvc.Controller
     
            Private db As schema_crmEntities = New schema_crmEntities
        '
        ' GET: /Search
        Function Index() As ActionResult
            Return View()
        End Function
     
     
        '
        ' POST: /Search
            <HttpPost()>
            Function Index(search As String, choix As Integer) As ActionResult
                Dim test As Integer = Request("choix")
                Dim chaine As String = Request("searchString")
                Dim message As String = "message"
                Dim tabMot() = chaine.Split(New Char() {" "c})
                If test = 3 Then
                    ReDim tabMot(0)
                    tabMot(0) = chaine
                End If
     
                Dim predicate1 = PredicateBuilder.False(Of meeting)()
                For Each mot In tabMot
                    If test = 2 Then
                        predicate1 = predicate1.And(Function(m) m.compteRendu.Contains(mot))
                    Else
                        predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(mot))
                    End If
                Next
                Dim meetings = db.meeting.AsExpandable().Where(predicate1)
     
                Dim predicate2 = PredicateBuilder.False(Of interview)()
                For Each mot In tabMot
                    If test = 2 Then
                        predicate2 = predicate2.And(Function(m) m.compteRendu.Contains(mot))
                    Else
                        predicate2 = predicate2.Or(Function(m) m.compteRendu.Contains(mot))
                    End If
                Next
                Dim interviews = db.interview.AsExpandable().Where(predicate2)
     
                Dim predicate3 = PredicateBuilder.False(Of opportunite)()
                For Each mot In tabMot
                    If test = 2 Then
                        predicate3 = predicate3.And(Function(m) m.nomOffre.Contains(mot))
                    Else
                        predicate3 = predicate3.Or(Function(m) m.nomOffre.Contains(mot))
                    End If
                Next
                Dim opportunites = db.opportunite.AsExpandable().Where(predicate3)
     
                Dim predicate4 = PredicateBuilder.False(Of client)()
                For Each mot In tabMot
                    If test = 2 Then
                        predicate4 = predicate4.And(Function(m) m.nomCompteClient.Contains(mot))
                    Else
     
                        predicate4 = predicate4.Or(Function(m) m.nomCompteClient.Contains(mot))
                    End If
                Next
                Dim clients = db.client.AsExpandable().Where(predicate4)
     
                Dim predicate5 = PredicateBuilder.False(Of contact)()
                For Each mot In tabMot
                    If test = 2 Then
                        predicate5 = predicate5.And(Function(m) m.nom.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.prenom.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.titre.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.departement.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.qualifications.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.langue1.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.langue2.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.langue3.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.langue4.Contains(mot))
                        predicate5 = predicate5.And(Function(m) m.langue5.Contains(mot))
                    Else
                        predicate5 = predicate5.Or(Function(m) m.nom.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.prenom.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.titre.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.departement.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.qualifications.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.langue1.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.langue2.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.langue3.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.langue4.Contains(mot))
                        predicate5 = predicate5.Or(Function(m) m.langue5.Contains(mot))
                    End If
                Next
                Dim contacts = db.contact.AsExpandable().Where(predicate5)
     
     
                Dim model = New SearchModel With {
                    .Meetings = meetings,
                    .Interviews = interviews,
                    .Opportunites = opportunites,
                    .Clients = clients,
                    .Contacts = contacts
                    }
     
     
                ViewBag.message = predicate1.ToString() + predicate2.ToString() + predicate3.ToString() + predicate4.ToString() + predicate5.ToString()
     
                Return View(model)
            End Function
        End Class
    End Namespace
    Et voici le PredicateBuilder
    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
    Imports System.Linq
    Imports System.Linq.Expressions
    Imports System.Collections.Generic
    Imports System.Runtime.CompilerServices
     
    Module PredicateBuilder
        Sub New()
        End Sub
        Public Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) True
        End Function
        Public Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
            Return Function(f) False
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Function [Or](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[OrElse](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
     
        <System.Runtime.CompilerServices.Extension()>
        Public Function [And](Of T)(expr1 As Expression(Of Func(Of T, Boolean)), expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
            Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
            Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[AndAlso](expr1.Body, invokedExpr), expr1.Parameters)
        End Function
    End Module

  8. #28
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Peux-tu montrer la valeur finale des prédicats (ce que tu mets dans ViewBag.message) ?

  9. #29
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    Mince, cela y était avant que je n'édite

    Donc :

    Si je mets 2 mots (test1 et test2), en mode "Or", j'obtiens ceci :
    f => ((False OrElse Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__25).$VB$Local_mot), f)) OrElse Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__25).$VB$Local_mot), f))f => ((False OrElse Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__26).$VB$Local_mot), f)) OrElse Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__26).$VB$Local_mot), f))f => ((False OrElse Invoke(m => m.nomOffre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__27).$VB$Local_mot), f)) OrElse Invoke(m => m.nomOffre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__27).$VB$Local_mot), f))f => ((False OrElse Invoke(m => m.nomCompteClient.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__28).$VB$Local_mot), f)) OrElse Invoke(m => m.nomCompteClient.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__28).$VB$Local_mot), f))f => ((((((((((((((((((((False OrElse Invoke(m => m.nom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.prenom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.titre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.departement.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.qualifications.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue1.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue2.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue3.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue4.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue5.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.nom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.prenom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.titre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.departement.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.qualifications.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue1.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue2.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue3.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue4.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) OrElse Invoke(m => m.langue5.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f))
    En mode And :
    f => ((False AndAlso Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__25).$VB$Local_mot), f)) AndAlso Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__25).$VB$Local_mot), f))f => ((False AndAlso Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__26).$VB$Local_mot), f)) AndAlso Invoke(m => m.compteRendu.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__26).$VB$Local_mot), f))f => ((False AndAlso Invoke(m => m.nomOffre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__27).$VB$Local_mot), f)) AndAlso Invoke(m => m.nomOffre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__27).$VB$Local_mot), f))f => ((False AndAlso Invoke(m => m.nomCompteClient.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__28).$VB$Local_mot), f)) AndAlso Invoke(m => m.nomCompteClient.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__28).$VB$Local_mot), f))f => ((((((((((((((((((((False AndAlso Invoke(m => m.nom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.prenom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.titre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.departement.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.qualifications.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue1.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue2.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue3.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue4.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue5.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.nom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.prenom.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.titre.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.departement.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.qualifications.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue1.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue2.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue3.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue4.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f)) AndAlso Invoke(m => m.langue5.Contains(value(MvcApplication4.MvcApplication4.SearchController+_Closure$__29).$VB$Local_mot), f))

  10. #30
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Aïe, ça pique un peu les yeux

    Tu pourrais montrer plutôt juste le predicate1 ? Parce que là j'arrive même pas à voir où commence chaque prédicat...

  11. #31
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah non, je sais ce qui va pas en fait... un piège classique avec les expressions lambda (Sehnsucht l'avait signalé en plus, et le compilateur produit un warning qui pour une fois est tout à fait justifié)

    Dans la boucle où tu combines les conditions, il ne faut pas utiliser directement la variable de boucle dans l'expression lambda, car elle va changer de valeur. Il faut la copier dans une variable locale à l'intérieur de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                For Each mot In tabMot
                    Dim tmp = mot
                    If test = 2 Then
                        predicate1 = predicate1.And(Function(m) m.compteRendu.Contains(tmp))
                    Else
                        predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(tmp))
                    End If
                Next
    D'autre part, pour le And, c'est normal : le prédicat est initialisé à False, donc tu peux faire And avec n'importe quoi, ce sera toujours False... Pour le And il faut l'initialiser à True :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim predicate1 As Func(Of meeting, Boolean)
    If test = 2 Then ' And
        predicate1 = PredicateBuilder.True(Of meeting)()
    Else ' Or
        predicate1 = PredicateBuilder.False(Of meeting)()
    End If

  12. #32
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    Le "Or" fonctionne correctement. Un grand merci.



    Par contre, je n'arrive pas à utiliser ta déclaration de predicate1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                Dim predicate1 As Func(Of meeting, Boolean)
                For Each mot In tabMot
                    Dim tmp = mot
                    If test = 2 Then
                        predicate1 = PredicateBuilder.True(Of meeting)()
                        predicate1 = predicate1.And(Function(m) m.compteRendu.Contains(tmp))
                    Else
                        predicate1 = PredicateBuilder.False(Of meeting)()
                        predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(tmp))
                    End If
    PredicateBuilder.True(Of meeting)() est souligné, et me dit :
    Impossible de convertir une valeur de type 'System.linq.expression.expression(Of system.func(Of MvcApplication4.meeting, boolean))' en 'System.func(Of MvcApplication4.meeting, boolean)'.

  13. #33
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ah oui pardon, c'est ma déclaration de predicate1 qui était fausse. Voilà la bonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim predicate1 As Expression(Of Func(Of meeting, Boolean))

  14. #34
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    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
                Dim predicate1 As Expression(Of Func(Of meeting, Boolean))
                For Each mot In tabMot
                    Dim tmp = mot
                    If test = 2 Then
                        If tmp = tabMot(0) Then
                            predicate1 = PredicateBuilder.True(Of meeting)()
                        End If
                        predicate1 = predicate1.And(Function(m) m.compteRendu.Contains(tmp))
                    Else
                        If tmp = tabMot(0) Then
                            predicate1 = PredicateBuilder.False(Of meeting)()
                        End If
                        predicate1 = predicate1.Or(Function(m) m.compteRendu.Contains(tmp))
                    End If
                Next
                Dim meetings = db.meeting.AsExpandable().Where(predicate1)
    J'ai adapté le code, avant, il ne prenait en compte que le dernier mot que je rentrais. Une meilleure méthode que ne mettre "tmp = tabmot(0)"? Parce que si quelqu'un rentre 2 fois le même mot, l'erreur reviendrait.


    J'ai aussi une autre erreur. Aléatoirement, une fois sur 10, ma recherche retourne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    There is already an open DataReader associated with this Connection which must be closed first.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
     
    Exception Details: MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
     
    Source Error:
     
    Line 1872:    Public Property contact() As contact
    Line 1873:        Get
    Line 1874:            Return CType(Me, IEntityWithRelationships).RelationshipManager.GetRelatedReference(Of contact)("schema_crmModel.FK_int_contact", "contact").Value
    Line 1875:        End Get
    Line 1876:        Set
    A savoir que contact est la 5ème table sur laquelle j'exécute une requête.

  15. #35
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par patxy Voir le message
    J'ai adapté le code, avant, il ne prenait en compte que le dernier mot que je rentrais. Une meilleure méthode que ne mettre "tmp = tabmot(0)"? Parce que si quelqu'un rentre 2 fois le même mot, l'erreur reviendrait.
    Pourquoi tu n'initialises pas plutôt predicate1 avant la boucle ? ça règlerait le problème...

    Citation Envoyé par patxy Voir le message
    J'ai aussi une autre erreur. Aléatoirement, une fois sur 10, ma recherche retourne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    There is already an open DataReader associated with this Connection which must be closed first.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
     
    Exception Details: MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
     
    Source Error:
     
    Line 1872:    Public Property contact() As contact
    Line 1873:        Get
    Line 1874:            Return CType(Me, IEntityWithRelationships).RelationshipManager.GetRelatedReference(Of contact)("schema_crmModel.FK_int_contact", "contact").Value
    Line 1875:        End Get
    Line 1876:        Set
    A savoir que contact est la 5ème table sur laquelle j'exécute une requête.
    ça me dit rien... je me demande si c'est pas lié au provider MySQL, dont le support d'Entity Framework est un peu bancal

  16. #36
    Invité
    Invité(e)
    Par défaut
    There is already an open DataReader associated with this Connection which must be closed first.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    Peut être que cela pourra t'aider. Une fois je travaillais avec les Dataset, DataAdapter et DataReader etc... ce n'était pas un ORM dans ce cas et la base de données utilisée était SQL Server 2008. Après avoir vérifier que tout mes DataReader étaient bien utilisés (ouverts et fermés après chaque utilisation), il s'est avéré que pour que mon problème soit résout, il fallait ajouter dans la chaine de connexion la chaîne suivante : MultipleActiveResultSets=true

  17. #37
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pourquoi tu n'initialises pas plutôt predicate1 avant la boucle ? ça règlerait le problème...
    done!

    Citation Envoyé par h2s84
    il fallait ajouter dans la chaine de connexion la chaîne suivante : MultipleActiveResultSets=true
    Où veux tu que je mette ça exactement? Parce que si je place ça dans la chaine de connexion, je reçois ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Parser Error Message: Keyword not supported.
    Parameter name: multipleactiveresultsets
    Sinon, j'ai remarqué que c'était toujours les mêmes recherches qui buggaient. Un possible rapport avec le pooling? (pareil que la solution d'h2s, je sais pas comment mettre pooling=false :-/ )


    Tant qu'à faire, voici la connexionString.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      <connectionStrings>
        <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
        <remove name="LocalMySqlServer" />
        <add name="LocalMySqlServer" connectionString="database=schema_CRM;server=localhost;password=jeMangeDesEnfants;User Id=root" providerName="MySql.Data.MySqlClient" />
        <add name="schema_crmEntities" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;User Id=root;password=AuPetitDéjeuner;Persist Security Info=True;database=schema_crm&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>

  18. #38
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Après avoir vérifier que tout mes DataReader étaient bien utilisés (ouverts et fermés après chaque utilisation), il s'est avéré que pour que mon problème soit résout, il fallait ajouter dans la chaine de connexion la chaîne suivante : MultipleActiveResultSets=true
    Il me semble que MARS est spécifique à SQL Server, ça ne s'applique pas à MySQL

  19. #39
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Il me semble que MARS est spécifique à SQL Server, ça ne s'applique pas à MySQL
    Merci
    patxy tu peux oublier ce que j'ai dit

  20. #40
    Membre régulier
    Homme Profil pro
    .Net developer
    Inscrit en
    Février 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net developer

    Informations forums :
    Inscription : Février 2012
    Messages : 99
    Points : 91
    Points
    91
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <connectionStrings>
        <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Pooling=False;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
        <remove name="LocalMySqlServer" />
        <add name="LocalMySqlServer" connectionString="database=schema_CRM;server=localhost;password=CouCou;User Id=root;Pooling=False" providerName="MySql.Data.MySqlClient" />
        <add name="schema_crmEntities" connectionString="metadata=res://*/Models.Model1.csdl|res://*/Models.Model1.ssdl|res://*/Models.Model1.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;User Id=root;password=CaVa;Persist Security Info=True;Pooling=False;database=schema_crm&quot;" providerName="System.Data.EntityClient"  /> 
      </connectionStrings>
    Bon bah désactiver pooling n'a servi à rien :-(

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [Débutant] Requête LINQ Dynamique
    Par goessein dans le forum Linq
    Réponses: 7
    Dernier message: 20/10/2012, 15h33
  2. Réponses: 2
    Dernier message: 19/01/2012, 21h55
  3. [AC-2007] Création d'une requête croisée dynamique
    Par ibrahimandir dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/07/2009, 10h41
  4. Réponses: 3
    Dernier message: 04/08/2008, 15h35
  5. Réponses: 1
    Dernier message: 01/08/2008, 17h25

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