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 :

Première requête LinQ [Débutant]


Sujet :

Linq

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut Première requête LinQ
    Bonjour,

    Je débute en requête LinQ, et voila je n'arrive pas a faire ma première requête.

    J'ai une table ENTREPRISE NumEnt, NomEnt, DateEnt.

    et une table STAGE NumStage, DateStage, NumEnt#.

    J'aimerais récupéré les entreprise ayant accueilli un stagiaire dans l'année n, pour les affichés dans une listBox par la suite.

    J'ai d'abord essayer de récupéré les entreprise ayant accueilli un stagiaire mais sans succès, pouvez vous m'aider ?

    Mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var resu = from en in this._cad.ENTREPRISE
               join st in this._cad.STAGE on en equals st.ENTREPRISE
               select new{ENTREPRISE = en, st.DateSTAGE};
     
    foreach(var res in resu)
    {
       resultatRequete.Add(res.DateStage.tostring() + res.ENTREPRISE.tostring());
    }

    (j'utilise la doc MSDN pour débuter)

    Cordialement, Jour.




    Cordialement, Jour.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Voici avec les expressions Lambda.

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
        public class Entreprise
        {
            public int NumEnt { get; set; }
            public string NomEnt { get; set; }
            public DateTime DateEnt { get; set; }
            public List<Stage> Stages { get; set; }
        }
     
        public class Stage
        {
            public int NumStage { get; set; }
            public DateTime DateStage { get; set; }
        }
                var listEntreprise = new List<Entreprise>()
                {
                    new Entreprise()
                    {
                        NumEnt = 1,
                        NomEnt = "Nom1",
                        DateEnt = DateTime.Now.AddDays(-250),
                        Stages = new List<Stage>()
                        {
                            new Stage() { NumStage= 1 , DateStage = DateTime.Now.AddMonths(-22)},
                            new Stage() { NumStage= 2 , DateStage = DateTime.Now.AddMonths(-10)},
                            new Stage() { NumStage= 3 , DateStage = DateTime.Now.AddMonths(-5)},
                        }
                    },
                    new Entreprise()
                    {
                        NumEnt = 2,
                        NomEnt = "Nom2",
                        DateEnt = DateTime.Now.AddDays(-250),
                        Stages = new List<Stage>()
                        {
                            new Stage() { NumStage= 4 , DateStage = DateTime.Now.AddMonths(-45)},
                            new Stage() { NumStage= 5 , DateStage = DateTime.Now.AddMonths(-200)},
                            new Stage() { NumStage= 6 , DateStage = DateTime.Now.AddMonths(-7)},
                        }
                    },
                    new Entreprise()
                    {
                        NumEnt = 3,
                        NomEnt = "Nom3",
                        DateEnt = DateTime.Now.AddDays(-250),
                        Stages = new List<Stage>()
                        {
                            new Stage() { NumStage= 7 , DateStage = DateTime.Now.AddMonths(-36)},
                            new Stage() { NumStage= 8 , DateStage = DateTime.Now.AddMonths(-12)},
                            new Stage() { NumStage= 9 , DateStage = DateTime.Now},
                        }
                    },
                };
     
                var year = 2014;
     
                var result = listEntreprise.Where(e=> e.Stages.Any(s=> s.DateStage.Year == year));
    Dans mon exemple je recherche les entreprises qui ont accueillis un stagiaire en 2014. Il y a que l'entreprise "Nom3" qui correspond a ce critère et qui est renvoyé dans "result"


    Autre conseil :
    Évite d'appeler tes propriétés comme NumEnt mais utilise plutôt "Numero" --> On sait que c'est l' "Entreprise" et "Numero" est plus parlant que "Num"

  3. #3
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,

    A quoi ressemble ton schéma EDMX ? Pourrais-tu poster une capture d'écran ?
    "C'est tellement merdique que toute modification est une amélioration !"

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Merci.

    Le .Year sur le DateStage correspond a quoi ? Je ne l'ai pas, ce qui fait que je compare un string "year" a un Datetime "DateStage".

    [EDIT] la partie de mon shéma concerné :
    Nom : Capture.PNG
Affichages : 140
Taille : 61,2 Ko

  5. #5
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par jourzebest Voir le message
    Le .Year sur le DateStage correspond a quoi ? Je ne l'ai pas, ce qui fait que je compare un string "year" a un Datetime "DateStage".
    Year est une propriété de DateTime.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Summary:
        //     Represents an instant in time, typically expressed as a date and time of
        //     day.
        [Serializable]
        public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
        {
    //
            // Summary:
            //     Gets the year component of the date represented by this instance.
            //
            // Returns:
            //     The year, between 1 and 9999.
            public int Year { get; }
    }

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par katkiller Voir le message
    Year est une méthode de DateTime.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Summary:
        //     Represents an instant in time, typically expressed as a date and time of
        //     day.
        [Serializable]
        public struct DateTime : IComparable, IFormattable, IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
        {
    //
            // Summary:
            //     Gets the year component of the date represented by this instance.
            //
            // Returns:
            //     The year, between 1 and 9999.
            public int Year { get; }
    }
    Je n'y ai pas accés pourtant c'est un type System.DateTime

    De meme pour la méthode toString elle n'est pas reconnu par le LINQ to Entities

  7. #7
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Je ne vois pas de propriété DateStage dans la capture d'écran... ?!
    "C'est tellement merdique que toute modification est une amélioration !"

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par plume13 Voir le message
    Je ne vois pas de propriété DateStage dans la capture d'écran... ?!
    Oups oui désolé, c'était pour simplifier les nom dans mon premier post, cela correspond a DATE_DEBUT_STAGE

    Mon petit bout de code ressemble donc a ceci maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string year = txtCritere.Text;
    var result = _cad.ENTREPRISE.Where(en => en.STAGE.Any(s => s.DATE_DEBUT_STAGE == year));
     
    foreach(var uneVar in result)
    {
       resultatRequete.Add(uneVar.RAISON_SOCIAL_ENTREPRISE + uneVar.STAGE.ToString());
    }
    Message d'erreur : je ne peut pas comparais le DATE_DEBUT_STAGE DateTime a year String.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Bon j'ai compris
    DATE_DEBUT_STAGE et de type Nullable<DateTime>... (DateTime?)

    Voici la requête désormais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                var result = listEntreprise.Where(e=> e.Stages.Any(s=> (s.DateStage.HasValue ?  s.DateStage.Value.Year : 0) == year));

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par katkiller Voir le message
    Bon j'ai compris
    DATE_DEBUT_STAGE et de type Nullable<DateTime>... (DateTime?)

    Voici la requête désormais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                var result = listEntreprise.Where(e=> e.Stages.Any(s=> (s.DateStage.HasValue ?  s.DateStage.Value.Year : 0) == year));
    Super ca fonctionne

    Ca serait possible d'avoir le détail et une explication, s'il vous plait, parce que je vais en avoir pas mal a faire

  11. #11
    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
    Pas besoin de faire une jointure, puisque tu as déjà une propriété de navigation ENTREPRISE sur l'entité STAGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var resu = from st in this._cad.STAGE
               select new{st.ENTREPRISE, st.DateSTAGE};

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 57
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pas besoin de faire une jointure, puisque tu as déjà une propriété de navigation ENTREPRISE sur l'entité STAGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var resu = from st in this._cad.STAGE
               select new{st.ENTREPRISE, st.DateSTAGE};
    Merci, cette façon permet une requête un peu plus simple

  13. #13
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Pas besoin de faire une jointure, puisque tu as déjà une propriété de navigation ENTREPRISE sur l'entité STAGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var resu = from st in this._cad.STAGE
               select new{st.ENTREPRISE, st.DateSTAGE};
    Oui, c'est tellement plus simple

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

Discussions similaires

  1. Requête linq jointure
    Par oyigit dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2010, 16h02
  2. Colle sur un tri dans une requête linq to sql
    Par boby62423 dans le forum Linq
    Réponses: 5
    Dernier message: 18/03/2009, 10h01
  3. Réponses: 4
    Dernier message: 25/02/2009, 14h22
  4. Réponses: 3
    Dernier message: 19/05/2008, 10h36
  5. Réponses: 7
    Dernier message: 10/02/2008, 11h56

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