[VB.NET] enumerable order by string value

Julian50 Messages postés 13 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 18 août 2011 - 18 août 2011 à 14:13
Julian50 Messages postés 13 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 18 août 2011 - 18 août 2011 à 14:25
Bonjour à tous,

je cherche désespérément une solution pour simplifier un bout de code. Je résume la problèmatique dans une cas d'école.

Contexte:
J'ai une base de données "ProjetDB" sql avec une table "Clients". Considérons que la table contient un grand nombre de colonnes (ClientId,ClientNom,...). Dans ma solution j'ai un élément "Classes Linq to SQL" où j'ai ajouté la table "clients". J'ai donc une classe "clients" où il y a une propriété par colonne de la table.

Objectif:
je commence par exécuter une requête linq simple
Dim db as new ProjetDBDataContexte
dim query =  From a In a.clients Select a

Voilà maintenant, je cherche à classer la requête suivant une propriété de client. La difficulté est que cette propriété peut varier. Je peux demander un classement par toutes les propriétés existante. C'est utilisateur qui va choisir depuis un combobox, j'aurais donc en donnée d'entrée un string avec le nom de la propriété.

1er test avec un select case
Select case SortedProperty
case "ClientId"
query.OrderBy(Function(x) x.ClientId)
case "ClientNom"
query.OrderBy(Function(x) x.ClientNom)
...
.

end select


Avec autant de case que de propriété. Cela fonctionne mais c'est vraiment pas terrible avec une centaine de propriétés.

2eme test avec un callByName
query.OrderBy(Function(x) callByname(x,"ClientNom", calltype.get))

Beaucoup plus simple mais ne fonction pas j'obtiens l'erreur suivante".Impossible de trier par type 'System.Object'." Je ne comprends pas pourquoi

3eme test avec un module

j'ai trouvé ce code sur http://stackoverflow.com/questions/606997/linq-order-by-for-a-listof-myobjects
Mais même erreur.
Module OrderByExtensions
  <System.Runtime.CompilerServices.Extension()> _
  Public Function OrderByPropertyName(Of T)(ByVal e As IEnumerable(Of T), ByVal propertyName As String) As IOrderedEnumerable(Of T)
    Dim itemType  = GetType(T)
    Dim prop = itemType.GetProperty(propertyName)
    If prop Is Nothing Then Throw New ArgumentException("Object does not have the specified property")
    Dim propType = prop.PropertyType
    Dim funcType = GetType(Func(Of ,)).MakeGenericType(itemType, propType)
    Dim parameter = Expression.Parameter(itemType, "item")
    Dim exp = Expression.Lambda(funcType, Expression.MakeMemberAccess(parameter, prop), parameter)
    Dim params = New Object() {e, exp.Compile()}
    Return DirectCast(GetType(OrderByExtensions).GetMethod("InvokeOrderBy", Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).MakeGenericMethod(itemType, propType).Invoke(Nothing, params), IOrderedEnumerable(Of T))
  End Function
  Private Function InvokeOrderBy(Of T, U)(ByVal e As IEnumerable(Of T), ByVal f As Func(Of T, U)) As IOrderedEnumerable(Of T)
    Return Enumerable.OrderBy(e, f)
  End Function
End Module


Voilà donc je suis à la recherche d'une solution vb.net qui fonctionne et simple.
A l'avance merci.

1 réponse

Julian50 Messages postés 13 Date d'inscription mardi 4 mai 2010 Statut Membre Dernière intervention 18 août 2011
18 août 2011 à 14:25
excusez moi, il y a une erreur dans le 1er avec le select case
il faut déclarer une nouvelle variable.

 
Dim sortedQuery

Select case SortedProperty
case "ClientId"
sortedQuery = query.OrderBy(Function(x) x.ClientId)
case "ClientNom"
sortedQuery = query.OrderBy(Function(x) x.ClientNom)
...
.

end select


Voilà cela mieux comme cela
Désolé.
0
Rejoignez-nous