Bonjour à tous,

Je viens voir si vous pouvez m'aider dans la recherche d'une solution de construction de requête générique.

Je suis en train de développer un repository me permettant de créer facilement des requêtes linq to entites. Notamment une fonction permettant de prendre en entrée un iqueryable(T), un filtre (classe perso simple avec PropertyName str et Value obj) et de retourner en sortie un iqueryable(T).

Cette fonction construit une lambda expression et applique un filtre where sur le iqueryable (cf code). La fonction crée notamment à un moment un member access vers la propriété du type passé en paramètre. Cela marche très bien.

Le soucis maintenant c'est que je n'arrive pas à trouver comment faire la même chose avec une propriété de navigation par exemple "Adresses.Libelle".

D'avance un grand merci pour l'aide que vous pourrez m'apporter.

@ ++

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
 
 'Application'
 query = ApplyFilter(query, new EFHelpers.Filter("Libelle","Toto"))
'Je voudrais trouver comment faire'
 query = ApplyFilter(query, new EFHelpers.Filter("AdressesLibelle","Toto"))
 
        Public Function ApplyFilter(ByVal pQuery As IQueryable(Of TEntity),
                                ByVal pFilter As EFHelpers.Filter) As IQueryable(Of TEntity)
 
            Dim propInfo As PropertyInfo = GetType(TEntity).GetProperty(pFilter.PropertyName)
 
            Dim e As ParameterExpression = Expression.Parameter(GetType(TEntity), "e")
 
            Dim memberExp As MemberExpression = Expression.MakeMemberAccess(e, propInfo)
 
            Dim constTest As ConstantExpression = Expression.Constant(pFilter.Value, pFilter.Value.GetType)
 
            Dim binaryTest As BinaryExpression = Expression.Equal(memberExp, constTest)
 
            Dim lambda As Expression(Of Func(Of TEntity, Boolean)) = Expression.Lambda(Of Func(Of TEntity, Boolean))(binaryTest, e)
 
            return pQuery.Where(lambda)