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

Linq Discussion :

Requête Linq avec un MAX [Débutant]


Sujet :

Linq

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut Requête Linq avec un MAX
    Bonsoir à tous,
    Je suis sous VB.Net 2010 et j'ai fait une requête Linq qui ne fonctionne pas comme je voudrais, explication :
    J'ai un DataSet issu d'une base de données. Dans ce DataSet, je sélectionne un certain nombre d'enregistrements et je voudrais pouvoir obtenir l'enregistrement qui a la valeur la plus grande dans la colonne 'Sectime'. J'ai donc fais ma requête qui ressemble à celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Dim maRqtLinq = (From element In monDataSet.Tables("T_FTIR")
                                    Where (element.Item("Sectime") > maValeur - 600 And element.Item("Sectime") <= maValeur)
                                    Select New With {Key .Sectime = element.Item("Sectime")}).Max
    Elle fonctionne tant que la clause WHERE retourne qu'un enregistrement, ensuite, si plusieurs enregistrements sont retournés, j'ai une erreur du type : Au moins un objet doit implémenter IComparable.
    Et là, je bloque depuis plusieurs jours. Alors, si quelqu'un avait une idée pour me sortir de là.

    Merci beaucoup et bonne soirée.

    Thierry

  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
    Pour que Max fonctionne, il faut qu'il sache comment comparer 2 éléments pour déterminer le plus grand. D'où le besoin d'IComparable. Tu peux essayer avec
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mondataset.Tables("T_FTIR").OrderBy(d => element.Item("Sectime")).Select(d => new Key {Sectime = e.element.Item("Sectime")}).Last();

    C'est du C#, mais facilement traduisible

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut
    Bonsoir et merci pour cette réponse mais cette requête ne peut fonctionner car le membre OrderBy n'existe pas pour mon objet "Tables". De plus, pourrais-tu m'expliquer en quelques mots ce que fait cette requête car je n'arrive pas trop à suivre. Je ne suis pas trop habitué à Linq et j'essai de me forcer à l'utiliser.
    Merci

    Thierry

  4. #4
    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
    oups. Pour avoir OrderBy, il faut ajouter la référence System.Data.DataSetExtension. Puis :
    Using System.Data

    Après tu peux utiliser OrderBy

    La requête prends les lignes de la table T_FTIR donc la valeur de la colonne 'sectime" est plus grande que (mavaleur - 600) et plus petite que mavaleur (where).
    Il crée un type anonyme avec cette valeur comme propriété (select). Et puis il prend le plus grand (max).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Par défaut
    Bonsoir,
    ces derniers jours je n'ai pas eu le temps de me pencher concrètement sur mon projet.
    C'est chose faite aujourd'hui et pour revenir sur mon problème, j'ai bien ajouté la référence System.Data.DataSetExtension mais impossible d'obtenir le membre OrderBy à mon objet monDataSet.Tables("T_FTIR"). Quant au System.Data je l'avais déja importé dans la partie Général/Déclarations.
    J'aurai bien aimé savoir pourquoi ? Mais bon... en comprenant ta requête j'ai trouvé une solution qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Dim maRqtLinq = (From element In monDataSet.Tables("T_FTIR")
                                    Where (element.Item("Sectime") > maValeur - 600 And element.Item("Sectime") <= maValeur) Order By element.Item("Sectime") Descending
                                    Take 1).ToList
    Merci encore

    Thierry

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

Discussions similaires

  1. Aide sur une requête LINQ avec left outer join
    Par jbrasselet dans le forum Linq
    Réponses: 5
    Dernier message: 12/09/2011, 09h31
  2. Liaison requête Linq avec un bindingSource
    Par 0redd dans le forum Linq
    Réponses: 4
    Dernier message: 13/08/2010, 00h14
  3. Réponses: 1
    Dernier message: 08/05/2010, 16h35
  4. requête linq avec Delphi ?
    Par sam-sam dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/09/2009, 15h21
  5. Requête select avec champ max
    Par qltmi dans le forum Excel
    Réponses: 1
    Dernier message: 20/08/2008, 15h33

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