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

Windows Forms Discussion :

Utilisation de LINQ


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 97
    Points : 51
    Points
    51
    Par défaut Utilisation de LINQ
    Bnjour,

    voilà mon soucis :

    Histoire de ne pas mourir bête, je voudrais me servir de LINQ pour trier mes données dans un dataset, une datatable pour dire vrai.

    J'ai une datatable dont les données proviennent d'un fichier texte, avec une 15aine de colonnes.

    Je veux permettre à mon utilisateur de faire un tri sur chacune de ces colonnes par le biais d'une combobox reprennant les valeurs (UNIQUE) de chacune des colonnes de mon tableau.

    J'ai donc affecté un gestionnaire d'évènement commun à toutes mes combobox et dans cet évènement doit venir mon code LINQ

    Je souhaite écrire une requete qui prenne en compte chacune de mes combobox et surtout qui, si la combobox n'a pas été modifier, utilise l'équivalent de "*" en sql. Et c'est principalement la que je bloque.

    Quelqu'un aurait-il un bout de code avec une combobox à me montrer, y a peut-etre (sans doute même) qlqchose que j'ai pas compris dans l'utilisation de LINQ.

    D'avance merci,
    Thierry

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Tommy57 Voir le message
    Je veux permettre à mon utilisateur de faire un tri sur chacune de ces colonnes par le biais d'une combobox reprennant les valeurs (UNIQUE) de chacune des colonnes de mon tableau.
    Je suppose que tu parles d'un filtre, plutôt que d'un tri ?

    Quand on bosse avec des DataSets, Linq n'est pas forcément la panacée ; pour faire de simples filtres, tu auras sans doute plus vite fait d'utiliser une DataView ou une BindingSource, en spécifiant le filtre sous forme de chaine. Par contre Linq s'avère très utile dès que tu veux faire des choses plus complexes, avec des jointures, groupements, etc.

    Voilà quand même une solution à base de Linq. Je prends des noms de colonnes un peu bidon, tu adapteras selon ton besoin. Je sais pas si tu veux du C# ou du VB.NET, donc je te le donne en C#, et tu pourras toujours convertir si nécessaire.

    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
    var query = table.AsEnumerable();
    if (comboBoxNom.SelectedValue != null)
    {
        string nom = (string)comboBoxNom.SelectedValue;
        query = query.Where(row => row.Field<string>("Nom") == nom);
    }
    if (comboBoxAge.SelectedValue != null)
    {
        int age = (int)comboBoxNom.SelectedValue;
        query = query.Where(row => row.Field<int>("Age") == age);
    }
    if (comboBoxDate.SelectedValue != null)
    {
        DateTime date = (DateTime)comboBoxNom.SelectedValue;
        query = query.Where(row => row.Field<DateTime>("Date") == date);
    }
    // etc ...
     
    dataGridView1.DataSource = query.AsDataView();

    En gros, le résultat final sera quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    table.AsEnumerable()
           .Where(row => row.Field<string>("Nom") == nom)
           .Where(row => row.Field<int>("Age") == age)
           .Where(row => row.Field<DateTime>("Date") == date)
           // etc...
           .AsDataView();

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 97
    Points : 51
    Points
    51
    Par défaut
    Merci Tomlev pour ton aide,

    effectivement je parlais de filtre. Et je code en VB

    Mais c'est effectivement pour faire la jonction entre différentes table que je souhaite utiliser linq.

    Cependant, pourrais-tu me donner qlq explication sur ton code?

    tu fais la requête en deux partie, pourquoi? Clarté du code ou nécessité technique?
    Que retourne exactement les boucles if?
    je ne comprend pas le code à l'interieur des () dans les boucles if, pourrais-tu m’éclairer un peu?

    merci
    Thierry

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Tommy57 Voir le message
    Mais c'est effectivement pour faire la jonction entre différentes table que je souhaite utiliser linq.
    Jointure, pas jonction
    Mais dans ce cas il faudrait que tu précises un peu ce que tu veux, parce que je ne peux pas deviner ton cas d'utilisation...

    [quote=Tommy57;7462992]Cependant, pourrais-tu me donner qlq explication sur ton code?[/QUOTE
    Chaque bloc "if" vérifie si l'utilisateur a sélectionné une valeur dans un ComboBox, et si c'est le cas, ajoute le filtre correspondant à la requête

    Citation Envoyé par Tommy57 Voir le message
    tu fais la requête en deux partie, pourquoi?
    Comment ça en 2 parties ? Le 2e morceau de code que j'ai posté n'est pas une 2e partie, c'est juste pour montrer à quoi pourrait ressembler la requête finale après avoir ajouté tous les filtres

    Citation Envoyé par Tommy57 Voir le message
    Que retourne exactement les boucles if?
    Euh... rien du tout. Comme je l'ai dit plus haut, chaque bloc if ajoute un filtre si nécessaire.

    Citation Envoyé par Tommy57 Voir le message
    je ne comprend pas le code à l'interieur des () dans les boucles if, pourrais-tu m’éclairer un peu?
    C'est-à-dire ? Il y a plusieurs parenthèses, desquelles parles-tu ?
    Je suppose que c'est l'appel à la méthode Where qui te pose problème ? Le paramètre de Where est un prédicat, c'est à dire une fonction qui renvoie true ou false pour l'objet qu'on lui passe en paramètre. Ici, ce prédicat est exprimé sous forme d'une expression lambda (une sorte de fonction anonyme)

    Quand j'écris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = query.Where(row => row.Field<string>("Nom") == nom);
    C'est en quelque sorte un raccourci pour ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    query = query.Where(FiltreParNom);
    ...
     
    bool FiltreParNom(DataRow row)
    {
        return row.Field<string>("Nom") == nom;
    }
    (en fait il y a une différence un peu subtile, mais je ne vais pas rentrer dans ce genre de détail pour l'instant)

    Quant à la partie row.Field<string>("Nom"), ça renvoie la valeur de type string de la colonne "Nom" de la ligne row.

    En VB.NET, les blocs if ressembleraient à ça :

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If comboBoxNom.SelectedValue IsNot Nothing Then
        Dim nom As String = CType(comboBoxNom.SelectedValue, String)
        query = query.Where(Function(row) row.Field(Of String)("Nom") = nom)
    End If

    PS: il n'y a pas de "boucle if"... Une boucle c'est pour répéter un bloc de code, ce qui n'est clairement pas le cas de if

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/06/2011, 12h00
  2. (Théorie) Utilisation de LINQ to SQL
    Par mixaBaby dans le forum Linq
    Réponses: 5
    Dernier message: 04/05/2010, 16h07
  3. utiliser linq avec silverlight
    Par almora007 dans le forum Silverlight
    Réponses: 9
    Dernier message: 29/05/2008, 18h45
  4. utiliser c#3.0 et linq
    Par maa dans le forum Linq
    Réponses: 22
    Dernier message: 14/02/2007, 00h01

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