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

Entity Framework Discussion :

Erreur lors des opérations sur les dates


Sujet :

Entity Framework

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 373
    Par défaut Erreur lors des opérations sur les dates
    Bonjour à tous,

    J'ai crée une fonction de recherche(tableau) qui à partir d'une jointure, retourne un type anonyme. le tableau contient des données de dates sur lesquelles des opérations peuvent être effectuée. Voici la fonction en question:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
     
            public static object[] RechercherAgentsAbcence(string aAgentMatricule, string aNomPrenom,string aEquipe,string aIdentifiantAbcence, string aTypeAbcence, DateTime aDebutPeriode, 
                                                           DateTime aFinPeriode)
            {
     
                var q = (from oAgsAbcent in ContexteDAO.ContexteDonnees.AgentsAbscences
                         join oAgent in ContexteDAO.ContexteDonnees.Agents on
                         oAgsAbcent.Agents_Matricule equals oAgent.AgentMatricule
                         join oAbcence in ContexteDAO.ContexteDonnees.Abscences
                         on oAgsAbcent.IdentifiantAbscence equals oAbcence.IdentifiantAbscence
                         select new 
                         {
                             oAgent.AgentMatricule,
                             oAgent.Nom,
                             oAgent.Prenom,
                             oAgent.Photo,
                             oAgent.AgentEquipe,
                             oAbcence.IdentifiantAbscence,
                             oAbcence.TypeAbscence,
                             oAbcence.MotifsAbscence,
                             oAbcence.DebutAbscence,
                             oAbcence.DureeAbscence
                         });
     
     
     
                if (!string.IsNullOrEmpty(aAgentMatricule))
                {
                    q = q.Where(a => a.AgentMatricule.Contains(aAgentMatricule));
                }
     
                if (!string.IsNullOrEmpty(aNomPrenom))
                {
                    q = q.Where(a => a.Nom.Contains(aNomPrenom));
                }
     
                if (string.IsNullOrWhiteSpace(aEquipe))
                {
                    q = q.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
     
                if (!string.IsNullOrEmpty(aEquipe))
                {
                    q = q.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
     
     
     
                if (!string.IsNullOrEmpty(aIdentifiantAbcence))
                {
                    q = q.Where(a => a.IdentifiantAbscence.Contains(aIdentifiantAbcence));
                }
     
                if (!string.IsNullOrEmpty(aTypeAbcence))
                {
                    q = q.Where(a => a.TypeAbscence.Contains(aTypeAbcence));
                }
     
                if (aDebutPeriode < DateTime.MaxValue)
                {
                    q = q.Where(a => a.DebutAbscence <= aDebutPeriode);
     
                }
     
                if (DateTime.MaxValue > aFinPeriode)
                {
                    if (aTypeAbcence == "AHI")
                    {
                        q = q.Where(a => (a.DebutAbscence.AddHours(Convert.ToDouble(a.DureeAbscence))) <= aFinPeriode);
                    }
                    else if (aTypeAbcence == "")
                    {
                        //nothing to do
                    }
                    else
                    {
                        q = q.Where(a => (a.DebutAbscence.AddDays(Convert.ToDouble(a.DureeAbscence))) <= aFinPeriode);
                    }
                }
     
     
     
                return  q.ToArray();
     
     
     
            }
    Le problème est que lors des opérations sur les dates qui se soldent par un échec, j'ai ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LINQ to Entities ne reconnaît pas la méthode « System.DateTime AddDays(Double) », et cette dernière ne peut pas être traduite en expression de magasin.
    Je ne sais comment m'y prendre. Merci de m'aider à le résoudre.

    Cordialement.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 119
    Par défaut
    Bonjour,

    Linq traduit les requêtes en SQL et il ne comprend pas la fonction "AddDays(Double)" de DateTime lors de la traduction. Tu peux essayer de sortir l'opération de ta requête linq.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DateTime newDate = a.DebutAbscence.AddDays(Convert.ToDouble(a.DureeAbscence));
    q = q.Where(a => (newDate) <= aFinPeriode);
    PS: tu doit avoir le même problème avec le if du dessus.

    En espérant aider.

    Darkcrift

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Le souci c'est que ça risque de rapatrier beaucoup de données de la base.

    Tu dois pouvoir utiliser DbFunctions.AddDays, ça donnerait quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    q = q.Where(a => DbFunctions.AddDays(a.DebutAbscence, Convert.ToDouble(a.DureeAbscence)) <= aFinPeriode);

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 373
    Par défaut
    @darkcrift, la requête génère des erreurs (voir image jointes);

    @Pragmateek, j'utilise framework 4, alors que DbFunctions ne marche qu'avec le 6. N'y aurait-il pas une autre alternative.

    Cordialement.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 119
    Par défaut
    Je l'ai peut être loupé mais je ne voix pas d'image jointe dans ton poste...

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 373
    Par défaut
    Pardon le voici.
    Images attachées Images attachées  

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Dans ce cas avec EF 4 tu devrais avoir EntityFunctions.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 119
    Par défaut
    Je te disais d’essayer de sortir l’opération sur la date de la requête linq en créant une variable puis en utilisant cette variable dans ta requête linq.

    Tu créé ta variable "newDate" qui permet d'ajouter les jours d’absences à la date du jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime newDate = a.DebutAbscence.AddDays(Convert.ToDouble(a.DureeAbscence));
    Ensuite tu utilise ta variable "newdate" dans ta requête linq.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    q = q.Where(a => (newDate) <= aFinPeriode);
    Ça ne correspond pas au code que tu as mis en image jointe. Il est normal que ton code génère des erreurs.

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

Discussions similaires

  1. Opération sur les dates
    Par obily dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 19/01/2007, 14h30
  2. [2.0] Comment réaliser des opérations sur les ensembles ?
    Par Cereal123 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 23/10/2006, 13h01
  3. opération sur les dates
    Par AMARI_SALIM dans le forum Langage
    Réponses: 14
    Dernier message: 19/07/2006, 18h05
  4. faire des opérations sur la date courante
    Par transistor49 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/04/2006, 17h39
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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