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

Dotnet Discussion :

Entity Clause Where et répéteur [Débutant]


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut Entity Clause Where et répéteur
    Bonjour,

    Voilà, j'ai une société avec des contacts (personnel de la société en français)

    Je souhaite avoir une liste des tous les contacts de la société classer par order alphabétique. J'ai donc fait une fonction (au passage si quelqu'un peut me dire si on peut faire du tri du style MaSoc.Contacts.orderby ...)
    Je reviens à ma question de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Shared Function GetContacts(ByVal IdSoc As Integer, ByVal LesDatas As kickoff2012Entities, Optional ByVal Status As String = "") As Object
            Try
                Dim Query = (From Cont In LesDatas.Contacts Where Cont.IDSociete = IdSoc Order By Cont.Nom, Cont.Prenom Select Cont)
                If Status <> "" Then Query = Query.Where(Function(a, b) a.StatutInvitation = Status)
                Return Query
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    Voici l'appel de ma fonction
    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
     
    Private Sub BindListeCollaborateurs()
            Dim soc As Societe = SocieteClass.GetSociete(ConnectedUser.IDSociete, LesDatas)
            Dim lstCont
            If ConnectedUser.EstManager Then
                Page.Title = "Liste des collaborateurs " & soc.Libelle
                lstCont = SocieteClass.GetContacts(soc.IDSociete, LesDatas)
            Else
                Page.Title = "Liste des collègues invités " & soc.Libelle
                lstCont = SocieteClass.GetContacts(soc.IDSociete, LesDatas, "A")
            End If
     
            rpt1.DataSource = lstCont
            rpt1.DataBind()
     
        End Sub
    Si je suis manager, ça marche
    Mais si je ne le suis pas je souhaite n'afficher qu'un certain profil de contact
    et là mon filtre se plante sur msg error :
    LINQ to Entities ne reconnaît pas la méthode « System.Linq.IQueryable`1[KickOff.Contact] Where[Contact](System.Linq.IQueryable`1[KickOff.Contact], System.Linq.Expressions.Expression`1[System.Func`3[KickOff.Contact,System.Int32,System.Boolean]]) », et cette dernière ne peut pas être traduite en expression de magasin.
    Je dois avouer être un gros débutant sur ces clauses where et je ne les compends pas très bien. Si quelqu'un pouvait m'aider en m'expliquant un peu le fonctionnement ...

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est une erreur typique avec Linq To Entities.

    Une requête Linq To Entities est traduite en SQL lors de son execution. Par conséquent, elle ne doit pas comporter d'éléments qui n'ont pas leur équivalent SQL. Tu peux pas appeler des fonctions, etc ... qui ne sont pas interprétables en SQL.

    Dans ton cas, tu vois bien que tout fonctionne lorsque tu es "Manager" mais que ça plante lorsque tu ne l'es pas. En regardant ton code, on constate que dans le cas ou ça plante, tu executes cette portion de code en plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Status <> "" Then Query = Query.Where(Function(a, b) a.StatutInvitation = Status)
    C'est donc là que se situe l'erreur.

    La première solution consiste donc à remplacer l'élément qui provoque l'erreur en utilisant une méthode "compatible" SQL.

    Si ce n'est pas possible, il faut procéder en deux étapes.
    Tu fais une première requête Linq to Entities avec la partie qui fonctionne. Tu fais ensuite une projection (via un .ToList() ou autre).
    Le fait de faire un ToList() va executer la requête.
    Tu peux ensuite faire ton filtre sur le Statut et ça fonctionnera car tu ne fais plus du Linq To Entities. Tu as déjà rappatrié les données.

    Par contre, c'est pas top dans ton cas car tu vas récupérer des données inutiles et ensuite les filtrer. Dans l'idéal, il faut ramener de la BDD seulement les données qui sont vraiment utiles.

    J'espère que j'ai été clair.

  3. #3
    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 : 43
    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
    Par défaut
    Pourquoi utilises-tu la surcharge de Where qui prend un prédicat à 2 paramètres ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.Where(Function(a, b) a.StatutInvitation = Status)
    Le deuxième paramètre du prédicat (b) correspond à la position de l'élémént, mais :
    - tu ne l'utilises pas
    - ce n'est pas traduisible en SQL (à ma connaissance en tous cas)

    Il suffit donc que tu utilises la surcharge qui prend un prédicat avec un seul paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.Where(Function(a) a.StatutInvitation = Status)

  4. #4
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    Vendredi, quand j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.Where(Function(a) a.StatutInvitation = "A")
    J'avais un message d'erreur, à la compile qui me parlai de mettre un 2nd argument (j'ai fais sans poser de question pour voir ce qui se passerai)
    Le message d'erreur disparu ...
    Je reessaye ce matin comme tu le suggères ... et ça marche

    2 solutions :
    - soit que j'ai modifié mon code sans faire attention et j'ai oublié depuis le weekend
    - soit mon visual studio a fumé un plomb à l'arrivée de Weekend

    Par contre, peux-tu m'en dire plus sur :
    Le deuxième paramètre du prédicat (b) correspond à la position de l'élémént
    ça sert à quoi?

  5. #5
    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 : 43
    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
    Par défaut
    Citation Envoyé par BROWNY Voir le message
    Par contre, peux-tu m'en dire plus sur :

    ça sert à quoi?
    Quand tu veux faire un filtre qui prend en compte la position de l'élément dans la séquence... Par exemple ce filtre prend un élément sur trois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.Where(Function(item, index) index Mod 3 = 0)
    en pratique ça sert assez rarement...

  6. #6
    Membre éprouvé
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Billets dans le blog
    2
    Par défaut
    ok merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2017, 10h35
  2. Clause Where en link to entity
    Par anthride dans le forum Entity Framework
    Réponses: 14
    Dernier message: 15/06/2011, 08h40
  3. LINQ clause where + ID entity
    Par Kikuts dans le forum Linq
    Réponses: 2
    Dernier message: 15/04/2011, 14h09
  4. probleme avec le caractere 'Z' dans ma clause WHERE
    Par dibox dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/04/2004, 12h21
  5. [ character en simple cote ] clause Where
    Par hocinema dans le forum DB2
    Réponses: 3
    Dernier message: 20/02/2004, 10h17

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