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 :

Sélectionner selon la date la plus récente


Sujet :

Linq

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut Sélectionner selon la date la plus récente
    Bonjour

    J'ai un champ date saisi dans la console de l'application en format "MMyyyy"
    J'ai un fichier xml où il y a des balises qui on un attribut date sous format Date="22 02 2013 15:07:16"

    Je voudrais dans la requête faire une comparaison de tel façon à ce que je sélectionne la date la plus récente par rapport à la date du fichier.

    Par exemple si je saisi 032013
    et que dans le fichier j'ai les dates suivantes:
    Date="25 05 2013 15:07:16"
    Date="22 02 2013 16:07:16"
    Date="22 02 2013 15:07:16"
    Date="22 02 2013 10:07:16"


    il faut que le résultat de la requête soit seulement
    Date="22 02 2013 16:07:16"
    je sélectionne pas celle qui est postérieure et aussi qui est antérieure de plus d'un an.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pas testé, mais un truc du genre devrait faire l'affaire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // La date saisie par l'utilisateur (01 Mars 2013)
    var inputDate = new DateTime(2013, 3, 1);
     
    var date = (from item in xmlData
                // On filtre sur les Dates inférieures ou égales à la date saisie
                where item.Date <= inputDate
                // On ne sélectionne que la plus grande
                select item).Max(x => x.Date);
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Merci pour la réponse

    Juste une autre question moi j'ai déjà la date (input) sous forme MMyyyy par exemple 122012 (déc 2012) et les balises sur lesquelles je fais le filtrage sont sous forme <nomBalise attributDate="22 02 2013 15:23:45" comment je fais la conversion des dates pour faire la comparaison?

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le format de date en entrée n'étant pas standard, je ne pense pas qu'il sera possible de le convertir en DateTime. Tu dois donc créer une méthode qui prend en entrée ta date au format bizarre, la parse, puis retourne une date valide. Ensuite tu pourras appeler cette méthode directement dans ta requête Linq. Voici un exemple :
    Code C# : 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
    DateTime ConvertToValidDateTime(string input)
    {
        // The culture used to read the input before the convertion occurs
        var cultureFR = new CultureInfo("fr-FR");
     
        // Removes all spaces
        input = input.Replace(" ", string.Empty);
        // Adds a slash after the day
        input = input.Insert(2, "/");
        // Adds a slash after the month
        input = input.Insert(5, "/");
        // Adds a space after the year
        input = input.Insert(10, " ");
     
        // Converts and returns the DateTime
        return Convert.ToDateTime(input, cultureFR);
    }
    Et la requête Linq devient donc quelque chose comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var date = (from item in xmlData
                where ConvertToValidDateTime(item.Date) <= inputDate
                select item).Max(x => x.Date);
    Sachant que item.Date étant de type string, ce qui correspond à ton attribut XML attributDate.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var queryDelete = (from item in bp
                                                  where DateTime.Parse(item.Attribute("ExecutionDate").Value.ToString()).Date <= dt.Date 
                                                  select item).Max(x => x.Date);
    J'ai essayé ce code mais au niveau du x.Date il y a cette Erreur 'System.Xml.Linq.XElement' ne contient pas une définition pour 'Date' et aucune méthode d'extension 'Date' acceptant un premier argument de type 'System.Xml.Linq.XElement' n'a été trouvée

    bp est le noeud qui contient l'attribut ExecutionDate
    dt = date input

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    la dt est formaté comme suit :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime.TryParseExact(sample, formatString, null, System.Globalization.DateTimeStyles.None, out dt)

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    string formatString = "MMyyyy";
    string sample = date;

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    J'ai compris l'erreur on peut pas faire le Max sur l'élément il faut qu'il soit sur l'attribut

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var queryDelete = (from item in bp
                                                  where DateTime.Parse(item.Attribute("ExecutionDate").Value) <= dt.Date
                                                   select item);

    elle me sélectionne les dates inférieures à la date input mais quand j'essaye d'ajouter le max ça marche pas car il y a une erreur dans le code

  10. #10
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Quelle est l'erreur ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    En fait moi plus précisement je veux sélectionner seulement l'élément qui a la l'attribut 'ExecutionDate la plus récente.

    Pour l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'System.Xml.Linq.XElement' ne contient pas une définition pour 'Date' et aucune méthode d'extension 'Date' acceptant un premier argument de type 'System.Xml.Linq.XElement' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante*?)

  12. #12
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Peux-tu poster tout ou partie de ton fichier XML ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    <TP>
    <BDef>
    <Bd>
    <app></app>
    <BL>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    </BL>
    </Bd>

    <Bd>
    <app></app>
    <BL>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    <BP ExecutionDate="..."></BP>
    </BL>
    </Bd>
    </BDef>
    </TP>

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Je veux garder la BP la plus récente de chaque Bd et les autres je veux les supprimer

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    C'est résolu merci Matt
    Je me suis trompé au niveau de l'attribut du Max
    Erreur de débutant

  16. #16
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Quand la requête ne renvoie aucun élément j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    La séquence ne contient aucun élément 
    à System.Linq.Enumerable.Max[Tsource]<IEnumerable'1 source>
    à System.Linq.Enumerable.Max[Tsource, Tresult]<IEnumerable'1 source, Func'2 selector>

  17. #17
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Essaie de rajouter un test avant, soit au début de ta requête LinQ dans le WHERE, soit avant la requête, une fois que le fichier est chargé. Dans ce test, tu vérifieras s'il y a des données à traiter ou pas.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  18. #18
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     var queryDelete = (from item in bp
                                                  where DateTime.Parse(item.Attribute("ExecutionDate").Value) < dt.Date.AddMonths(1)
                                                   select item).Max(x => DateTime.Parse(x.Attribute("ExecutionDate").Value));
    Moi j'ai cette requete comment je peux mettre un test

  19. #19
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    Le problème c'est quand le résultat de la requête est null

  20. #20
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 125
    Points : 72
    Points
    72
    Par défaut
    c'est bon j'ai résolu le problème

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

Discussions similaires

  1. Sélectionner sur la date la plus récente
    Par joshdeater dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/02/2014, 15h27
  2. Réponses: 4
    Dernier message: 05/05/2011, 13h46
  3. Sélectionner 1 seul enregistrements selon la date la plus grande
    Par Ronaldinho dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/08/2009, 13h26
  4. Select la date la plus récente
    Par NicoNGRI dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2005, 16h45
  5. Extraire la date la plus récente Database MYsql
    Par brazza dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/11/2004, 02h34

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