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 :

Problématique de Linq-Ef et retour de listes de données [Débutant]


Sujet :

Entity Framework

  1. #1
    Membre à l'essai
    Homme Profil pro
    Alternant en concepteur developpeur
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant en concepteur developpeur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 17
    Points
    17
    Par défaut Problématique de Linq-Ef et retour de listes de données
    Bonjour,

    Je cherche à mettre en place un service WCF qui va se charger de mettre à disposition pour des clients (un terminal WPF), une méthode permettant d'obtenir une liste d'alerte texte. Je cherche à produire une liste contenant titre, texte, date de début de l'alerte date de fin, ainsi que le mode et la priorité de l'alerte (ces deux paramètres ont chacun leur table).

    Pour garantir un cohérence dans mes données j'ai ajouté une table de mappage.

    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
     
    List<Alert> lstAlert = new List<Alert>();
    using (DSdatabaseEntitiesService = new DSdatabaseEntitiesService ())
    {
       var query = from p in aserv.Alertlog
                         join mp in aserv.AlertMap on p.AlertID equals mp.AlertID
                         join md in aserv.AlertMode on mp.AlertModeID equals md.AlertModeID
                         join pr in aserv.AlertPriority on mp.AlertPriorityID equals pr.AlertPriorityID
                         where p.AlertActive == true
                         select new {AlertID = p.AlertID, AlertMode = md.AlertModeCde, AlertPriority = pr.AlertPriority, AlertTitle = p.AlertTitle, AlertText = p.AlertText, AlertStartDate = p.AlertStartDate, AlertEndDate = p.AlertEndDate};
     
       foreach (AlertLog singleAlert in query)
       {
           Alert a = new Alert();
           a.alertId = singleAlert.AlertID;
           a.alertModeCde = singleAlert.AlertMode;
           a.alertPriorityCde = singleAlert.AlertPriority;
           a.AlertTitle = singleAlert.AlertTitle ;
           a.AlertText =singleAlert.AlertText ;
           a.AlertStartDate = singleAlert.AlertStartDate ;
           a.AlertEndDate = singleAlert.AlertEndDate ;
           lstAlert.Add(a);
       }
    }
    return lstAlert;
     
    }
    Mon problème est que je n'arrive pas à produire une variable de sortie pour ma liste. Je ne connais pas la bonne syntaxe.
    J'ai un soucis déjà dans mon instruction "select new"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AlertMode = md.AlertModeCde
    AlertModeCde est une chaine de type String et AlertMode le nom de la classe de données. Je ne sais pas comment synchroniser les deux (genre AlertModeCde = md.AlertModeCde)

    Si je retire ces deux paramètres pour test, j'ai une erreur "impossible de convertir le type "AnonumousType#1" en "AlertServiceDev.AlertLog" . Je sais que c'est le "select new" qui fait ça, mais je ne vois pas comment résoudre le problème

    Si je fais comme ça

    L'interface du Service WCF s'ouvre, mais si je teste la méthode, j'obtient une erreur "le type d'entitité ou le type complexe DSdatabaseModel.AlertLog"
    ne peut pas être construit dans une requête LINQ to entities.

    Classe AlertLog (générée par EF)
    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
     
    public partial class AlertLog
    {
       public AlertLog()
       {
           this.AlertMap = new HashSet<AlertMap>();
       }
     
       public int AlertID {get;set;}
       public string AlertTitle 
       public string AlertText
       public DateTime AlertStartDate {get;set;}
       public DateTime AlertEndDate {get;set;}
       public bool AlertActive {get;set;}
     
       public virtual ICollection<AlertMap> AlertMap {get;set;}
      public virtual AlertMode AlertMode {get;set}
      public virtual AlertPriority AlertPriority {get;set}
     
    }
    En vous remerciant de vos lumières
    Cordialement

  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
    Salut et bienvenue,

    EntityFramework est vraiment là pour te faciliter la tache, tu n'auras plus besoin de faire tes "join" car il connait les jointures pour toi. Ce qui va grandement simplifier ta requête Linq.

    Liens :


    Il y a aussi une histoire de LazyLoding (je te laisse regarder le premier lien... N'hésite pas si tu as des questions)

    Ici j'utilise "include" car je simule que le LazyLoadingEnabled est à "false".
    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
     
    List<Alert> lstAlert = new List<Alert>();
    using (DSdatabaseEntitiesService db = new DSdatabaseEntitiesService ())
    {
    //Ici vu que tu n'utilises pas AlertMap je l'ai mis en commentaire.
       var query = from p in db.Alertlog.Include(a => a.AlertMode).Include(a => a.AlertMap).Include(a => a.AlertPriority)
    //.Include(a => a.AlertMap)
                         where p.AlertActive == true
                         select p;
     
       foreach (AlertLog singleAlert in query)
       {
           Alert a = new Alert();
           a.alertId = singleAlert.AlertID;
           a.alertModeCde = singleAlert.AlertMode;
           a.alertPriorityCde = singleAlert.AlertPriority;
           a.AlertTitle = singleAlert.AlertTitle ;
           a.AlertText =singleAlert.AlertText ;
           a.AlertStartDate = singleAlert.AlertStartDate ;
           a.AlertEndDate = singleAlert.AlertEndDate ;
           lstAlert.Add(a);
       }
    }
    return lstAlert;
     
    }
    PS: Je ne suis pas un tueur de chat (pour ne pas effrayer ton animal)...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Alternant en concepteur developpeur
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant en concepteur developpeur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Merci de ta réponse. J'ai mis un moment à piger pourquoi tu as indiqué ne pas être un tueur de chat... (jusqu'a ce que je relise ton pseudo...)

    J'obtient une erreur avec cette ligne "impossible de convertir expression lambda en type "string" car il ne s'agit pas d'un type délégué"

  4. #4
    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
    Il faut importer le namespace "System.Data.entity" sinon les méthodes d'extensions ne peuvent pas être trouvées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Data.Entity;

  5. #5
    Membre à l'essai
    Homme Profil pro
    Alternant en concepteur developpeur
    Inscrit en
    Mars 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant en concepteur developpeur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Grâce à ton exemple, j'ai pu changer ma requete :

    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
     
    var query = from p in db.AlertMap.Include(a => a.AlertLog).Include(a => a.AlertMode).Include(a => a.AlertPriority)
    where p.AlertLog.AlertActive == true;
     
    foreach (AlertMap singleAlert in query)
    {
    Alert a = new Alert();
           a.alertId = singleAlert.AlertID;
           a.alertModeCde = singleAlert.AlertMode.AlertModeCde;
           a.alertPriorityCde = singleAlert.AlertPriority.AlertPriorityCde;
           a.AlertTitle = singleAlert.AlertLog.AlertTitle ;
           a.AlertText =singleAlert.AlertLog.AlertText ;
           a.AlertStartDate = singleAlert.AlertLog.AlertStartDate ;
           a.AlertEndDate = singleAlert.AlertLog.AlertEndDate ;
           lstAlert.Add(a);
    }
    En fait, cela me permet d'exploiter véritablement la fonction de ma table AlertMap. Merci beaucoup, ça va m'aider également pour ma web-app mvc qui va exploiter du coup la même requête mais dans un create cette fois ci. Cela me rassure sur la pertinence de mon modèle.

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

Discussions similaires

  1. Retour de liste deroulante
    Par samuel4256 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 22/07/2010, 13h42
  2. [Vxi3] Retour de listes de valeurs
    Par pressdell dans le forum Webi
    Réponses: 2
    Dernier message: 06/11/2009, 08h49
  3. [Linq To Object] Comparer 2 listes.
    Par Gregory.M dans le forum Linq
    Réponses: 1
    Dernier message: 29/05/2009, 09h24
  4. [LINQ] Where avec une Generic.List
    Par Firedeal dans le forum Framework .NET
    Réponses: 2
    Dernier message: 28/03/2008, 15h32

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