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

ASP.NET Discussion :

Linq : filtre dynamique [Débutant]


Sujet :

ASP.NET

Vue hybride

Pelote2012 Bonjour, Suite à des... 06/08/2014, 16h51
Pelote2012 j'avance un peu ... ... 07/08/2014, 11h59
M_Makia Bonjour, je n'ai pas de... 07/08/2014, 12h41
Pelote2012 Euréka 07/08/2014, 14h19
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Suite à des précédents posts, j'ai créé une fonction qui tri de manière dynamique sur la class et sur les propriétés.
    Maintenant, j'essaie d'appliquer le même principe pour le filtre (clause where). Mais comme j'ai du mal encore avec les function Lambda et les expression ...
    Code vb.net : 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
    Public Class FonctionOf(Of MaClass As Class)
            Public Shared Function AppliqueFiltreTri(ByVal lstOrig As IEnumerable(Of Object), ByVal MesDonnees As TableFullOption.PagerTabEnCours) As IEnumerable(Of Object)
     
                Dim query As IEnumerable(Of Object) = From le As MaClass In lstOrig Select le 'Where _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(0)) OrElse le.Name.Contains(MesDonnees.Filtre(0)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(1)) OrElse le.Major.Contains(MesDonnees.Filtre(1)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(2)) OrElse le.Sex.Contains(MesDonnees.Filtre(2)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(3)) OrElse le.English.ToString.Contains(MesDonnees.Filtre(3)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(4)) OrElse le.Japanese.ToString.Contains(MesDonnees.Filtre(4)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(5)) OrElse le.Calculus.ToString.Contains(MesDonnees.Filtre(5)), True, False)) AndAlso _
                '            (If(Not HelperString.ContientInfo(MesDonnees.Filtre(6)) OrElse le.Geometry.ToString.Contains(MesDonnees.Filtre(6)), True, False))    
     
                Dim TypeClass As Type = GetType(MaClass)
     
                For Each Sort In MesDonnees.MesOptions
     
                    Dim sortPropertyName As String = Sort.ColName
     
                    If (TypeClass.GetProperties().Any(Function(prop) prop.Name = sortPropertyName AndAlso prop.CanRead)) Then
     
                        Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
     
                        Dim paramExpr As ParameterExpression = Expression.Parameter(TypeClass, "instance")
     
                        Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
                        If pinfo.PropertyType.IsValueType Then
                            Expr = Expression.Convert(Expr, GetType(Object))
                        End If
     
                        Dim orderByFunc As Func(Of MaClass, Object) = Expression.Lambda(Of Func(Of MaClass, Object))(Expr, paramExpr).Compile()
                        Dim sortFunc As Func(Of IEnumerable(Of MaClass), IOrderedEnumerable(Of MaClass)) = Nothing
     
                        If (Not CBool(Sort.Sens)) Then
                            sortFunc = (Function(source) source.OrderBy(orderByFunc))
                        Else
                            sortFunc = (Function(source) source.OrderByDescending(orderByFunc))
                        End If
     
                        query = sortFunc(query).ToList() 
     
                    End If
                Next
     
                Return query.AsEnumerable
     
            End Function
        End Class

    Le bloc mis en commentaire est mon ancien filtre (qui marche, mais qui n'est pas du tout dynamique)

    J'ai essayé d'insérer au dessus de Dim orderByFunc As Func ...
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      If HelperString.ContientInfo(Sort.Search) Then
                            Dim whereFunc As Func(Of MaClass, Object) = Expression.Lambda(Of Func(Of MaClass, Object))(Expr, paramExpr).Compile()
                            Dim FilterFunc = (Function(source) source.Where(whereFunc.ToString.Contains(Sort.Search)))
                            query = FilterFunc(query).ToList()
                        End If
    mais il me crache une erreur du genre cast de string en boolean impossible ...
    D'accord j'essaie de manipuler des objets dont je ne comprend pas grand-chose

    Merci de votre aide et de vos éclaircissement


    [EDIT]
    J'ai trouvé ça mais je galère pour l'intégrer

    Code vb.net : 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
     
     Dim TypeClass As Type = GetType(MaClass)
     
                Dim dynamiclambda As Expression = Nothing
                Dim func As MethodCallExpression = Nothing
     
                For Each Sort In MesDonnees.MesOptions
     
                    Dim sortPropertyName As String = Sort.ColName
     
                    'Information sur la propriété recherchée
                    Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
                    If Not IsNothing(pinfo) Then
     
                        Dim paramExpr As ParameterExpression = Expression.Parameter(TypeClass, "instance")
     
                        Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
                        If pinfo.PropertyType.IsValueType Then
                            Expr = Expression.Convert(Expr, GetType(Object))
                        End If
     
          func = Expression.Call(Expr, containsmethod, Expression.Constant(Request.Forms[propertyName]))
                        If Not IsNothing(dynamiclambda) Then
     
                            dynamiclambda = func
                        Else
     
                            dynamiclambda = Expression.Or(dynamiclambda, func)
                        End If
                    End If
                Next
                If Not IsNothing(dynamiclambda) Then
                    Dim compiled As Func(Of MaClass, Boolean) = Expression.Lambda(Of Func(Of MaClass, Boolean))(dynamiclambda, paramExpr).Compile()
                    query = query.Where(compiled).ToList()
                End If

  2. #2
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    j'avance un peu ...

    Code vb.net : 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
     
     Public Shared Function Search(Of MaClass As Class)(query As IQueryable(Of MaClass), propertyName As String, value As String) As IQueryable(Of MaClass)
     
            Dim param As ParameterExpression = Expression.Parameter(GetType(MaClass), "$$param$$")
     
            Dim Left As Expression = Expression.Property(param, propertyName)
            Dim right As Expression = Expression.Constant(value)
     
            Dim comparaison As Expression = Expression.Equal(Left, right)
            Dim filter As Func(Of MaClass, Boolean) = Expression.Lambda(Of Func(Of MaClass, Boolean))(comparaison, param).Compile()
     
            Return query.Where(filter)
        End Function
     
        Public Shared Function AppliqueFiltreTri(Of MaClass As Class)(ByVal lstOrig As IEnumerable(Of MaClass), ByVal MesDonnees As TableFullOption.PagerTabEnCours) As IQueryable(Of MaClass)
     
            Dim query As IQueryable(Of MaClass) = From le As MaClass In lstOrig.AsQueryable Select le
     
            Dim TypeClass As Type = GetType(MaClass)
     
     
            For Each Sort In MesDonnees.MesOptions
                If HelperString.ContientInfo(Sort.Search) Then
                    Dim sortPropertyName As String = Sort.ColName
     
                    'Information sur la propriété recherchée
                    Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
                    If Not IsNothing(pinfo) Then
     
                        Dim paramExpr As ParameterExpression = Expression.Parameter(TypeClass, "instance")
     
                        Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
                        If pinfo.PropertyType.IsValueType Then
                            Expr = Expression.Convert(Expr, GetType(Object))
                        End If
     
                        query = Search(Of MaClass)(query, sortPropertyName, Sort.Search)
     
                    End If
                End If
            Next
     
            Return query.AsQueryable
     
        End Function

    Mais j'ai une erreur dans la fonction Search ligne : Return query.Where(filter)

    System.InvalidCastException: Impossible d'effectuer un cast d'un objet de type 'WhereEnumerableIterator`1[Jquery.WebForm2+Eleve]' en type 'System.Linq.IQueryable`1[Jquery.WebForm2+Eleve]'." & vbCrLf & " à Jquery.TableFullOption.Search[MaClass](IQueryable`1 query, String propertyName, String value) dans D:\Test\Jquery\Jquery\TableFullOptionPerso\TableStruct.vb:ligne 61" & vbCrLf & " à Jquery.TableFullOption.AppliqueFiltreTri[MaClass](IEnumerable`1 lstOrig, PagerTabEnCours MesDonnees) dans D:\Test\Jquery\Jquery\TableFullOptionPerso\TableStruct.vb:ligne 102" & vbCrLf & " à Jquery.TablePlugin.GetlstEleve(PagerTabEnCours MesDonnees) dans D:\Test\Jquery\Jquery\TableFullOptionPerso\TablePlugin.aspx.vb:ligne 35}

  3. #3
    Membre expérimenté Avatar de M_Makia
    Homme Profil pro
    dev
    Inscrit en
    Février 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 121
    Par défaut
    Bonjour,

    je n'ai pas de solution pour ton problème mais tu trouveras certainement ton bonheur avec cette lib => https://www.nuget.org/packages/Syste....Dynamic/1.0.2
    Un exemple ici => http://weblogs.asp.net/scottgu/dynam...-query-library

  4. #4
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut Euréka
    Merci de l'aide. Je cherche à faire filtre assez sommaire. C'est pour une recherche dans un tableau.

    J'ai réussi
    Code vb.net : 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
     
     For Each Sort In MesDonnees.MesOptions
                If HelperString.ContientInfo(Sort.Search) Then
                    Dim sortPropertyName As String = Sort.ColName
     
                    'Information sur la propriété recherchée
                    Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName)
                    If Not IsNothing(pinfo) Then
     
                        Dim paramExpr As ParameterExpression = Expression.Parameter(TypeClass, "instance")
     
                        Dim Expr As Expression = Expression.Property(paramExpr, pinfo)
                        If pinfo.PropertyType.IsValueType Then
                            Expr = Expression.Convert(Expr, GetType(Object))
                        End If
     
                        Dim right As Expression = Expression.Constant(Sort.Search)
     
                        Dim comparaison As Expression = Expression.Equal(Expr, right)
                        Dim filter As Func(Of MaClass, Boolean) = Expression.Lambda(Of Func(Of MaClass, Boolean))(comparaison, paramExpr).Compile()
     
                        query = query.AsQueryable.Where(filter).AsEnumerable
     
                    End If
                End If
            Next

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

Discussions similaires

  1. BO XI WebI filtre dynamique
    Par marion782 dans le forum Webi
    Réponses: 5
    Dernier message: 16/01/2007, 12h13
  2. Réponses: 4
    Dernier message: 06/01/2007, 15h27
  3. Réponses: 8
    Dernier message: 03/01/2007, 10h51
  4. [débutant] Filtre 'dynamique' sur une JTable
    Par d_token dans le forum Composants
    Réponses: 8
    Dernier message: 04/08/2006, 12h01
  5. Filtre Dynamiques
    Par Sparal dans le forum Access
    Réponses: 2
    Dernier message: 05/05/2006, 11h14

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