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 :

Doublons dans le résultat d'une requête avec Entity Framework


Sujet :

Entity Framework

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Doublons dans le résultat d'une requête avec Entity Framework
    Bonsoir ,

    Je suis entrain de développer une application en C# MVC 4 et j'utilise entity Framework comme ORM.Depuis un temps je suis confronté a un problème que je ne comprends pas.

    En fait j'ai crée une vue dans ma base de donnée qui renvoie les bonne données comme je veux (au niveau de mon SGBD SQL Server 2008 ).
    Mais lorsque j’accède a ces données en utilisant une requête Linq ,je suis surpris cas j'ai des doublons dans le résultats.
    Par exemple si le résultat soit renvoyé 4 enregistres (ce qui est correct au niveau de sql server 2008), la requete sur mon entity me renvoie 4 mais avec les deux dernier comme doublons donc laisse un seul.

    Voici ma requete entity
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var resultat =          
    (
       from c in db.VP_HISTORIQUE_STOCK_SPROGRESSIF 
       where (c.ID_Depot == stock_materiel.ID_Depot && c.ID_Materiel  == stock_materiel.ID_Materiel  && c.Date > filtre.DateDebut && c.Date < filtre.CDateFin)  
       select c
    );

  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,

    Si tu as "sql profiler" n'hésite pas a regarder la requête généré pas EF.

    Je pencherai pour une erreur dans ta requête mais sinon tu peux utiliser le "Distinct" en Linq...

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Oui, il te faudrait comparer la requête SQL générée par EF (resultat.ToString(), dans ton exemple) et la requête SQL que tu exécutes manuellement.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Bonjour ,
    J'ai bien vérifier la requête exécute avec Sql Profiler ,j ai exécuter cette requête dans Sql server 2008( SSMS) ,j'ai aussi vérifier les résultats renvoyer pas ma requête entity en mode débogage,je constate toujours que les données dans la base de données ne sont pas en doublons mais celui de mon Entity l'ai, en plus de cela il remplace une ligne pas un doublons donc n'affiche pas le dernier élément des résultat
    Je ne sais pas si c'est normal mais c'est bizarre pour moi , ci dessous les capture des doublons dans le résultat en mode debug de VS 2012,la requête généré pas le Link annalyse pas SQL Profiler,le résultat de la requête Link de sql profiler dans SQL server 2008.

    Vraiment ça m'étonne je n'ai jamais vu un truc pareil !!!
    Images attachées Images attachées     

  5. #5
    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
    C'est un problème courant lorsqu'EF est utilisé sur une vue. EF désigne par défaut le premier champ non null de la table comme étant la clef primaire. Ce comportement est normal puisqu'une clé primaire ne peut pas être null.

    Or s'il y a des valeurs identiques, il perd les pédales et crée alors des doublons. La solution consiste à définir sur la vue, dans l'EDMX, la clé primaire. Si aucune colonne de la vue ne peut être définie comme étant la clé primaire (colonne non null), alors il faut ajouter une colonne dans la vue (côté SQL Server cette fois) qui contiendra un identifiant unique (j'insiste sur le mot unique) et non null, puis rafraichir l'EDMX. En principe ça devrait te permettre d'obtenir le résultat attendu.
    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.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Bonjour

    Effectivement DotNetMatt, je suis d'accord avec toi ,mais ma vue a une clé primaire fabrique(concaténation deux clé service demandé et produit c-a id_service.id_materiel).
    J'ai aussi générer une clé automatique (qui est le numéro de la ligne courant le fameux ROW_NUMBER() )

    Celà pose toujours le même problème ,Là vraiment je ne sais pas quoi faire et comment continuer .

    Je suis même inquiet quand aux différent projet déjà réalisés avec EF.

    C'est vraiment bizarre celà

  7. #7
    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
    Citation Envoyé par tobus2012 Voir le message
    mais ma vue a une clé primaire fabrique(concaténation deux clé service demandé et produit c-a id_service.id_materiel).
    Dans SQL Server les vues n'ont pas de clé primaire. Il est juste possible d'ajouter des index, mais ça n'a rien à voir avec une clé primaire...

    Citation Envoyé par tobus2012 Voir le message
    Celà pose toujours le même problème ,Là vraiment je ne sais pas quoi faire et comment continuer .
    Tes explications ne sont pas claires du tout, qu'as-tu fait exactement ? As-tu bien défini explicitement la clef primaire dans l'EDMX ? Toujours dans l'EDMX, tes colonnes sont-elles bien non nullables ? Ce dernier point est absolument vital.

    J'ai déjà eu recours à ce genre de manip sans problème particulier, si ça ne marche pas, c'est parce que tu dois avoir un paramétrage incorrect.
    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.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Bonjour

    Ok DotNetMatt

    Mes champs sont tous non null ,la création d'index ne marche pas sur la vue (Impossible de créer un index cas celle-ci n'est pas liée a un shéma)
    ci-dessous les résultats renvoyés pas la vue que j'utilise ,quand je parle d'id fabriqué je fais allusion a la première colonne.

    Je précise que tous les champs de ma vue sont non null.
    Images attachées Images attachées  

  9. #9
    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
    Merci pour la capture. En fait le résultat de la requête de la vue donne l'impression que les colonnes ne peuvent pas être NULL, mais ce n'est pas le cas. En effet même si dans les tables sous-jacentes les colonnes sont définies comme NOT NULL, il se peut que dans la vue, par le jeu des jointures par exemple, des NULL puissent apparaître. Ce qu'il faut faire c'est contraindre la colonne à ne pas pouvoir être NULL. Par exemple si tu veux définir ta clé primaire sur la colonne ID, il faut utiliser quelque chose comme ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ISNULL(CAST(id AS int), 0) AS id
    Il est désormais impossible d'obtenir un NULL dans la colonne id.
    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.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Bonjour

    J'ai fais des revérifications DotNetMatt, et j'ai constaté qu'il y a une ligne qui est null dans le résultat de la requête, sur la capture du post précédente il y a un tuple qui est NULL.
    Je pense que c'est elle le problème.

    Comment la retirer j'ai essayé avec le IS NOT NULL sur les colonnes de la vue mais elle apparait toujours.

    Merci pour tes indications précieuse DotNetMatt et qui m ont permis de capitaliser encore plus.

Discussions similaires

  1. [AC-2002] export dans excel du résultat d'une requête avec paramètre
    Par marcelisa2 dans le forum VBA Access
    Réponses: 6
    Dernier message: 31/10/2010, 21h01
  2. Réponses: 12
    Dernier message: 23/05/2007, 10h37
  3. [SQL] Recherche dans le résultat d'une requête
    Par Ekik dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/03/2007, 10h32
  4. Afficher le résultat d'une requête avec des côtes
    Par sweet_hell dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/10/2006, 10h32
  5. Pb résultats d'une requête avec ou sans Recordset
    Par fredeau dans le forum Access
    Réponses: 3
    Dernier message: 24/04/2006, 14h07

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