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 :

Requête LINQ imbriquée ou PropertyInfo


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut Requête LINQ imbriquée ou PropertyInfo
    Bonjour,

    J'ai une classe qui devient un type dans les propriétés d'une autre classe
    Cette classe contient que des propriétés
    exemple :

    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
     
    Public Class Field
        ' Constructeur
        Public Sub New(ByVal p_Order As Integer, Optional ByVal p_Value As String = "")
             _Order = p_Order
             _Value = p_Value
          End Sub
     
         ' Propriété Order
          Private _Order As Integer
          Public ReadOnly Property Order() As Boolean
             Get
                Return _Order
             End Get
          End Property
     
          ' Propriété Value
          ' Seule cette propriété est en lecture écriture
          Private _Value As String
          Public Property Value() As String
             Get
                Return _Value
             End Get
             Set(ByVal value As String)
                _Value = value
             End Set
          End Property
    End Class
    Ensuite j'ai la classe qui utilise la classe Field dans ses propriétés
    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
     
    Public Class Article
        Public Sub New()
             ' Initialisation des valeurs par défaut des propriétés lors de la création de l'instance (Champ Order de la classe Field
             ' Value est optionnel
             _Owner = New Field(2)  ' Propriété Order de la classe Field
             _ItemNumber = New Field(1)
       End Sub  
     
          Private _Owner As Field
          Public Property Owner() As Field
             Get
                Return _Owner
             End Get
             Set(ByVal value As Field)
                _Owner = value
             End Set
          End Property
     
          Private _ItemNumber As Field
          Public Property ItemNumber() As Field
             Get
                Return _ItemNumber
             End Get
             Set(ByVal value As Field)
                _ItemNumber = value
             End Set
          End Property
    End Class
    ' Collection d'articles
      Public Class Articles
          Inherits List(Of Article)
       End Class
    Utilisation de la classe dans une application console
    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
     
    Sub Main()
       Dim LesArticles as New Articles  ' Collection d'articles
       Dim UnArticle as Article            ' Article
     
       ' Ajout d'un premier article dans la collection
       UnArticle = New Article
       UnArticle.Owner.Value = "Valeur1"
       UnArticle.ItemNumber.value = "Bassine"
       LesArticles.Add(UnArticle)
       UnArticle = Nothing
     
      ' Ajout d'un deuxième article dans la collection
       UnArticle = New Article
       UnArticle.Owner.Value = "Valeur2"
       UnArticle.ItemNumber.value = "Assiette"
       LesArticles.Add(UnArticle)
       UnArticle = Nothing 
     
    End Sub
    Maintenant la question

    Je souhaiterai, à partir d'une requête LINQ to Object ou éventuellement par la réflexion (PropertyInfo)
    pouvoir récupérer toutes les valeurs de la propriété Value triées par Order dans la classe Article afin de sortir mes propriétés dans l'ordre de Order.

    Exemple

    'Article 1
    Bassine <- Propriété ItemNumber.value dont ItemNumber.Order = 1
    Valeur1 <- Propriété Owner.value dont Owner.Order = 2
    'Article 2
    Assiette <- Propriété ItemNumber.value dont ItemNumber.Order = 1
    Valeur2 <- Propriété Owner.value dont Owner.Order = 2

    J'espère être assez clair
    Merci de vos réponses

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Et le problème est ?

  3. #3
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Essaye ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Articles.SelectMany(d => (new List<Field> {d.ItemNumber, d.Owner}).OrderBy(e => e.Order));

    Désolé c'est du C# (Je ne connais pas VB) mais je pense qu'il n'y a pas trop de problèmes pour traduire.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut
    Pour l'instant j'ai résolu une partie du problème avec la réflexion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private sub Affiche(LesArticles as Articles)
      For Each oArticle As Article In LesArticles
        For Each PropInfo As PropertyInfo In oArticle.GetType().GetProperties()
          Dim oEval As Field = DirectCast(PropInfo.GetValue(oArticle, Nothing), Field)
          Console.WriteLine(oEval.Value & vbTab)
        Next
      Next
    End Sub
    Cela me permet de lister les valeurs de toutes mes propriétés, sans avoir à les écrire explicitement.
    Mais ça ne résout pas le problème de l'ordre d'apparition des propriétés dans le foreach.
    Elles apparaissent dans l'ordre de création dans la classe.
    Mais si le code est modifié, ce ne sera plus OK.

    Je vais regarder ta solution LINQ ce WE
    Merci pour ta réponse.

  5. #5
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Attention, réflexion a un coût question performance. A tester sur de gros volumes (Si ton appli est censé avoir de gros volumes)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut
    Voilà ma version en requête LINQ to Object
    Je ne sais pas si elle optimisée, mais elle fonctionne
    Elle permet de traverser toutes les propriétés pour récupérer de façon générique les valeurs.
    Merci pour t'on aide.
    Je la publie, elle peut être utile à d'autres.
    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
     
    Private Sub Affiche(ByVal p_LesArticles As Articles, ByVal p_PathFile As String)
          Dim LeStreamWriter As IO.StreamWriter = New IO.StreamWriter(p_PathFile)
          Dim strBuild As System.Text.StringBuilder
          For Each Article As Article In p_LesArticles
             ' Requete LINQ sur les propriétés
             Dim Result =
                From PropInfo In Article.GetType().GetProperties()
                     Let Prop = New With {.oEval = DirectCast(PropInfo.GetValue(Article, Nothing), Field),
                                          .Order = .oEval.order,
                                          .ReturnValue = .oEval.Value}
                Order By Prop.Order
                Select Prop.ReturnValue
     
             strBuild = New System.Text.StringBuilder
             For Each Valeur In Result
                strBuild.Append(Valeur & vbTab)
             Next
     
             strBuild.Remove(strBuild.Length - 1, 1)
             LeStreamWriter.WriteLine(strBuild)
             strBuild = Nothing
          Next
          LeStreamWriter.close()
       End Sub

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/02/2008, 11h56
  2. Requêtes doublement imbriquées
    Par sliderman dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/11/2007, 11h42
  3. Requête SQL imbriquées
    Par Fanette85 dans le forum ASP.NET
    Réponses: 20
    Dernier message: 05/10/2007, 14h12
  4. Réponses: 15
    Dernier message: 03/10/2007, 17h02
  5. Requêtes distribuées imbriquées
    Par mikedavem dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/05/2007, 14h12

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