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