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 vers DataTable


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 29
    Par défaut Linq vers DataTable
    Bonjour

    J'etais entrain de tester une requete Linq dans VB, ma requete et la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim query = From agents1 In agents.AsEnumerable() _
                     Where agents1.Field(Of String)("lieu")="Kolwezi" _ 
                     select agents1
     
    Dim table1 as DataTable=query.CopyToDataTable()
    ça marche très bien

    mais si je selectionne maintenant même deux colonnes seulement et la requête devient la suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim query = From agents1 In agents.AsEnumerable() _
                     Where agents1.Field(Of String)("lieu")="Kolwezi" _ 
                     select New {
                                      .Matricule=agents1.Field(Of String)("matricule) _
                                      .Nom=agents1.Field(Of String)("nom) _
                                      .Lieu=agents1.Field(Of String)("lieu) _
                                      }
     
    Dim table1 as DataTable=query.CopyToDataTable()
    j'ai un message d'erreur qui dit :
    ‘CopyToDataTable is not a member of Système.Data.EnumerableRowCollection(of <anonumous type>)’.
    Et quand j’essaie d’afficher ça dans une zone de liste ça marche. Comment faire pour affecter ces données dans un objet DataTable ?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Dans la méthode CopyToDataTable, il y a une contrainte sur le paramètre de type T : il doit hériter de DataRow. Or un type anonyme n'hérite pas de DataRow...

  3. #3
    Membre averti
    Inscrit en
    Août 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 29
    Par défaut
    Salut,

    Merci pour la réponse, mais y'a t-il pas une autre possibilité pour arriver à copier le résultat dans un datable?

    J'ai aussi pensé à une autre possibilité : pour afficher les résultats dans une zone de liste j'ai utilisé une boucle qui ajoute les Items au fur et à mesure. Maintenant dans ma boucle, à la place d'ajouter les Items dans la zonne de liste elle commence plutot à creer des datarow dans mon datatable au fur et a mesure.

    Mais essayé de cette idée mais j'etais bloqué quelque.

    Toutes vos suggestions pour me débloqué seront les bienvenues.

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par jospinkapwa Voir le message
    Merci pour la réponse, mais y'a t-il pas une autre possibilité pour arriver à copier le résultat dans un datable?
    Ben ça dépend... si tu connais déjà la structure de la table, tu peux simplement faire une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For Each x In query
        Dim row As DataRow = table.NewRow()
        row("Matricule") = x.Matricule
        row("Nom") = x.Nom
        row("Lieu") = x.Lieu
        table.Rows.Add(row)
    Next
    Si tu veux quelque chose de plus générique, tu peux générer la table dynamiquement par rapport aux propriétés de l'objet, en utilisant la réflexion... Voilà comment on pourrait le faire avec une méthode d'extension :
    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
    Imports System.Data
    Imports System.Collections.Generic
    Imports System.Reflection
    Imports System.Runtime.CompilerServices
     
    Public Module Extensions
     
        <Extension>
        Public Shared Function ToDataTable(Of T)(source As IEnumerable(Of T)) As DataTable
     
            Dim table As New DataTable()
            Dim properties As PropertyInfo() = GetType(T).GetProperties()
     
            ' On crée les colonnes pour chaque propriété
            For Each p In properties
                table.Columns.Add(p.Name, p.PropertyType)
            Next
     
            ' On crée les lignes pour chaque élément de la séquence
            For Each item In source
     
                Dim row As DataRow = table.NewRow()
     
                ' On copie les valeurs de chaque colonne
                For Each p In properties
                    row(p.Name) = p.GetValue(item, Nothing)
                Next
     
                table.Rows.Add(row)
            Next
     
            Return table
     
        End Function
     
    End Class

    Et pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim table As DataTable = query.ToDataTable()
    Citation Envoyé par jospinkapwa Voir le message
    J'ai aussi pensé à une autre possibilité : pour afficher les résultats dans une zone de liste j'ai utilisé une boucle qui ajoute les Items au fur et à mesure. Maintenant dans ma boucle, à la place d'ajouter les Items dans la zonne de liste elle commence plutot à creer des datarow dans mon datatable au fur et a mesure.
    Je vois pas trop l'intérêt de passer par une zone de liste... Le traitement que tu cherches à faire n'a rien à voir avec l'interface graphique, donc c'est bizarre d'utiliser un composant graphique pour le faire.

  5. #5
    Membre averti
    Inscrit en
    Août 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 29
    Par défaut
    Salut

    Merci beaucoup.

    Grace à votre aide j'ai pu y arriver.

    Merci encore

    Kapwa

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

Discussions similaires

  1. ResultSet java vers datatable/dataset C#
    Par ghosty177 dans le forum Services Web
    Réponses: 1
    Dernier message: 28/12/2010, 14h02
  2. linq vers base de données Oracle
    Par livinho38 dans le forum Silverlight
    Réponses: 13
    Dernier message: 31/05/2010, 12h01
  3. Réponses: 8
    Dernier message: 24/06/2009, 14h41
  4. LINQ vers fichier XML
    Par ChapiBoulo dans le forum Débuter
    Réponses: 2
    Dernier message: 20/05/2009, 13h34
  5. LINQ vers fichier XML
    Par ChapiBoulo dans le forum Débuter
    Réponses: 0
    Dernier message: 18/05/2009, 13h29

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