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

VB.NET Discussion :

LINQ requête reflection


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut LINQ requête reflection
    Bonjour,

    j'ai un petit soucis avec une requête. Je souhaite récupérer des informations en fonction du choix de l'utilisateur.
    Par exemple pour récupérer les valeurs des champs 'value' 'status' ainsi que le nombre de 'status' pour chaque 'value' je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim test = From p In dataChart Order By p.Status
                               Group By p.Status, p.value Into xValues = Group
                               Select series = xValues.LastOrDefault.value, X = xValues.LastOrDefault.Status, Y = xValues.Count
    J'obtiens bien ce que je souhaite, mais le soucis c'est que l'utilisateur peut choisir d'autres informations. J'essaie donc de mettre en place une requête dynamique mais lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    Dim test = From p In dataChart Order By p.GetType.GetProperty(model.xField)
                               Group By xField = p.GetType.GetProperty(model.xField).Name, yField = p.GetType.GetProperty(model.yField).Name Into xValues = Group
                              Select series = xValues.LastOrDefault.GetType.GetProperty(model.yField).GetValue(xValues.LastOrDefault, Nothing).ToString, _
                               X = xValues.LastOrDefault.GetType.GetProperty(model.xField).GetValue(xValues.LastOrDefault, Nothing).ToString, Y = xValues.Count Order By X
    je n'obtient que la valeur de la dernière ligne. Je pense que cela vient du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetValue(xValues.LastOrDefault, Nothing)
    mais pourquoi lors de la première requête, le xValues.LastOrDefault ne pose pas de soucis?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    Dans un premier temps je ne suis pas sur qu'il soit possible de combiner linq et la reflexion.

    Mais surtout c'est illisible, immaintenable et quid des perf ?

    Je serai toi, j'essayerai de passer par une autre methode: requetes avec filtre pre-definis, construction de sql plutot qu'utiliser linq etc.

    Bonne chance.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Si jamais cela peut te donner idées, voici ce que je fais dans un formulaire pour permettre à l'utilisateur de filtrer un datagridview suivant différents critères (jusqu'à 3 chez moi) et de trier la liste comme il le souhaite.

    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
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
        Private Sub FilterAndSortData(filters As Dictionary(Of Filter, Decimal), Optional ByVal PropertyToSort As String = Nothing, Optional ByVal sortorder As SortOrder = Nothing)
            Dim data = (From d In Promo.DTO.DetailsOwn
                        Select Id = d.Id, Department = d.Department, Brand = d.Brand, BrandCode = d.Brand.Code, BrandName = d.Brand.Description, Percentage = d.Percentage, PercentType = d.PercentType.Description, Description = d.Description, Note = d.Note, ListType = d.ListType, Type = "Own", Attachment = d.Attachment, Seasons = (d.Seasons.Count > 0), SeasonsList = d.Seasons).Concat(
                        From d In Promo.DTO.DetailsDepartment
                        Select id = d.Id, Department = d.Department, Brand = CType(Nothing, PROMO_DTO.Brand), BrandCode = CType(Nothing, Integer), BrandName = CType(Nothing, String), Percentage = d.Percentage, PercentType = d.PercentType.Description, Description = d.Description, Note = d.Note, ListType = d.ListType, Type = "Dept", Attachment = d.Attachment, Seasons = (d.Seasons.Count > 0), SeasonsList = d.Seasons)
     
     
            If Not IsNothing(filters) Then
                For Each key As Filter In filters.Keys
                    Select Case key
                        Case Filter.Department
                            data = (From d In data
                                    Where d.Department.Id = dicFilter(key)
                                    Select d)
                        Case Filter.Brand
                            data = (From d In data
                                    Where d.Brand.Id = dicFilter(key)
                                    Select d)
                        Case Filter.Percent
                            data = (From d In data
                                    Where d.Percentage = dicFilter(key)
                                    Select d)
                    End Select
                Next
            End If
     
            If Not IsNothing(PropertyToSort) Then
                If sortorder = Windows.Forms.SortOrder.Ascending Then
                    Select Case PropertyToSort
                        Case "Department"
                            data = data.OrderBy(Function(x) x.Department.Code)
                        Case "BrandCode"
                            data = data.OrderBy(Function(x) If(x.Brand Is Nothing, 0, x.Brand.Code))
                            'data = data.OrderBy(Function(x) x.Brand.Code)
                        Case "BrandName"
                            data = data.OrderBy(Function(x) If(x.Brand Is Nothing, "", x.Brand.Description))
                        Case "Percentage"
                            data = data.OrderBy(Function(x) x.Percentage)
                        Case "PercentType"
                            data = data.OrderBy(Function(x) x.PercentType)
                        Case "Description"
                            data = data.OrderBy(Function(x) x.Description)
                        Case "Note"
                            data = data.OrderBy(Function(x) x.Note)
                        Case "ListType"
                            data = data.OrderBy(Function(x) x.ListType)
                    End Select
                ElseIf sortorder = Windows.Forms.SortOrder.Descending Then
                    Select Case PropertyToSort
                        Case "Department"
                            data = data.OrderByDescending(Function(x) x.Department.Code)
                        Case "BrandCode"
                            data = data.OrderByDescending(Function(x) If(x.Brand Is Nothing, 0, x.Brand.Code))
                        Case "BrandName"
                            data = data.OrderByDescending(Function(x) If(x.Brand Is Nothing, "", x.Brand.Description))
                        Case "Percentage"
                            data = data.OrderByDescending(Function(x) x.Percentage)
                        Case "PercentType"
                            data = data.OrderByDescending(Function(x) x.PercentType)
                        Case "Description"
                            data = data.OrderByDescending(Function(x) x.Description)
                        Case "Note"
                            data = data.OrderByDescending(Function(x) x.Note)
                        Case "ListType"
                            data = data.OrderByDescending(Function(x) x.ListType)
                    End Select
                End If
            End If
     
            dgvOwn.DataSource = data.ToList
        End Sub
    Je ne prends pas la peine de donner la définition de mes objets car cela ne te sera d'aucune aide. C'est vraiment juste pour la logique utilisée. En espérant que ça puisse s'appliquer à ton cas.
    Kropernic

  4. #4
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    J'ai vite fait lu en travers ton code et les réponses des intervenants.
    Il me semble que ce que tu cherche à faire est tout simplement un arbre d'expression, et c'est ce que fait Linq. Je t'invite à regarder en large et en travers les arbres d'expression, le namespace System.Linq.Expressions, et surtout la classe Expression<T>.

    edit : Kopernic par exemple ton code serais plus joli en utilisant SwitchCase de cet espace de nom.
    "Le train de tes injures roule sur le rail de mon indifférence."

    "Monde de merde !!"

    Georges Abitbol.

  5. #5
    Membre régulier
    Homme Profil pro
    Etudiant
    Inscrit en
    Septembre 2012
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2012
    Messages : 69
    Points : 86
    Points
    86
    Par défaut
    Bonjour,

    Merci pour vos réponses et exemples. Je vais utiliser la même méthode que Kropernic. Je me mets de coté les Expression, je suis pas large niveau timing.

    Merci à vous.

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par worm83 Voir le message
    edit : Kopernic par exemple ton code serais plus joli en utilisant SwitchCase de cet espace de nom.
    Certes mais j'en ignorais l'existance jusqu'à ton message. J'ai déjà regardé un peu mais pas encore eu le temps de creuser la question. Mais ça a l'air bien cet affaire. Va falloir que j'apprenne à jouer avec... (les exemples de la MSDN n'avaient pas l'air d'être ce qu'il y a de plus démonstratif pour le coup... )
    Kropernic

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

Discussions similaires

  1. [Linq] Requêtes paramétrables
    Par MrDuChnok dans le forum Windows Phone
    Réponses: 19
    Dernier message: 24/02/2012, 11h23
  2. Linq requête except
    Par diaboloche dans le forum Linq
    Réponses: 5
    Dernier message: 26/05/2008, 16h21
  3. [Linq to sql] Problème de requête
    Par Ntotor dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/05/2008, 20h37
  4. Réponses: 7
    Dernier message: 10/02/2008, 11h56

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