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 ...
mais il me crache une erreur du genre cast de string en boolean impossible ...
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
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
Partager