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 :

requête personnalisée et problème de like sur un integer


Sujet :

Entity Framework

  1. #1
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut requête personnalisée et problème de like sur un integer
    Bonjour,

    dans le cadre de mon projet, j'utilise l'EF et pour une requête je construis ma requête à la mano pour des soucis de construction.

    Je dois ajouter une condition where de type like sur un integer.

    Voilà mon code :
    Code c# : 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
     
    String requete = "SELECT TCD.CartoEntry_Key as CartoEntryId ";
                requete += ", TCD.CartoEntry as CartoEntryLabel ";
                requete += ", TCD.CartoEntry_CodBasicat as CartoEntryBasicat ";
                requete += ", TCD.CartoEntry_Status as CartoEntryStatus ";
                requete += ", TCD.CartoEntry_Object_Type as CartoEntryObjectType ";
                requete += ", TCD.CartoEntry_Origin as CartoEntryOrigin ";
                requete += ", TRBD.Business_Domain as CartoEntryDomain ";
                requete += ", TRBS.Business_SubDomain as CartoEntrySubDomain ";
                requete += ", TCD.CartoEntry_ShortDesc_English as CartoEntryDescription ";
                requete += ", TLCCBO.Contact_Business_Owner_key as CartoEntry_BusinessOwnerKey ";
                requete += ", TLCCBO.Contact_Business_Owner_CUID as CartoEntry_BusinessOwnerCuid ";
                requete += ", TLCCBO.Contact_Business_Owner_First_Name + ' ' + TLCCBO.Contact_Business_Owner_Last_Name as CartoEntry_BusinessOwnerName ";
                requete += ", TLCCBO.Contact_Business_Owner_Role as CartoEntry_BusinessOwnerRole ";
                requete += ", TLCCBO.Contact_Business_Owner_Department as CartoEntry_BusinessOwnerOrganization ";
                requete += ", TLCC.Contact_key as CartoEntry_ItContactKey ";
                requete += ", TLCC.Contact_CUID as CartoEntry_ItContactCuid ";
                requete += ", TLCC.Contact_First_Name + ' ' + TLCC.Contact_Last_Name as CartoEntry_ItContactName ";
                requete += ", TLCC.Contact_Role as CartoEntry_ItContactRole ";
                requete += ", TLCC.Contact_Department as CartoEntry_ItContactOrganization ";
                requete += "FROM T_cartoentry_description as TCD left outer join t_ref_business_domain as TRBD on TCD.cartoentry_business_domain=TRBD.Business_domain_description ";
                requete += "left outer join t_ref_business_subdomain as TRBS on TCD.cartoentry_business_subdomain=TRBS.Business_subdomain_description ";
                requete += "left outer join t_link_cartoentry_business_product as TLCBP on TCD.CartoEntry=TLCBP.CartoEntry ";
                requete += "left outer join T_CartoEntry_Organization as TCO on TCD.CartoEntry=TCO.CartoEntry ";
                requete += "left outer join T_Ref_Business_Owner_Department as TRBOD ON TCO.CartoEntry_BO_Department = TRBOD.BO_Department_Email ";
                requete += "left outer join T_Ref_Business_Owner_Department_Level2 as TRBODL ON TCO.CartoEntry_BO_Department2 = TRBODL.BO_Department2_Email ";
                requete += "left outer join T_Link_CartoEntry_End_User as TLCEU on TCO.CartoEntry = TLCEU.CartoEntry ";
                requete += "left outer join T_Ref_Manager_Development as TRMD on TCO.CartoEntry_Manager_Development = TRMD.Manager_Development_Email ";
                requete += "left outer join T_Ref_Manager_Development_Level2 as TRMDL on TCO.CartoEntry_Manager_Development2 = TRMDL.Manager_Development2_Email ";
                requete += "left outer join T_Ref_Manager_Implementation as TRMI on TCO.CartoEntry_Manager_Implementation = TRMI.Manager_Implementation_Email ";
                requete += "left outer join T_Ref_Manager_Service as TRMS on TCO.CartoEntry_Manager_Service = TRMS.Manager_Service_Email ";
                requete += "left outer join T_CartoEntry_Ops_Services as TCOS on TCD.CartoEntry=TCOS.CartoEntry ";
                requete += "left outer join T_Ref_Manager_Operations as TRMO on TCO.CartoEntry_Manager_Operations = TRMO.Manager_Operations_Email ";
                requete += "left outer join T_Link_CartoEntry_Contact_Business_Owner as TLCCBO on TLCCBO.CartoEntry = TCD.CartoEntry ";
                requete += "left outer join T_Link_CartoEntry_Contact as TLCC on TLCC.CartoEntry = TCD.CartoEntry ";
    requete += "WHERE 1=1 ";
    subRequestCartoEntryKey += "AND TCD.CartoEntry_Key like '%"+s+"%'";
     
    ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(requete, bdd);
                log.LoggerFactory(new LogEvent(LogLevel.Error, "   [SQL]Execute Request : " + requete));
                list = query.ToList().ConvertTo<CartoEntryForSearchDto>();

    Mon champ TCD.CartoEntry_Key est un integer en base de données.
    Lorsque j'exécute la dernière ligne Visual Stuio me retourne cette erreur :
    LIKE arguments must be of string type. Near member access expression, line 1, column 2808.
    Je ne vois pas comment résoudre cela.
    J'ai voulu passer par un cast genre :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    subRequestCartoEntryKey += "AND cast(TCD.CartoEntry_Key as nvarchar) like '%"+s+"%'";
    mais à ce moment il me jette sur le nvarchar

    De même il me jette immédiatement sur le convert si je tente cette fonction.

    A coté de cela, ma requête fonctionne parfaitement sur SQL Server.

    Auriez-vous une idée ?
    Merci d'avance
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Euh? Ca fait quoi un LIKE sur un integer?

  3. #3
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Avec sql server ça marche.
    Si tu as 102, 306, 125, un like '%2%' te ramène 102 et 125.

    Je sais c'est débile mais c'est une demande du client
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Non mais il y a Entity SQL qui te permet de créer tes requêtes à la mano de façon plus efficace je trouve.

  5. #5
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Est-ce que ça ne veut pas simplement dire que Entity Framework ne sait pas faire de LIKE pour autre chose que des String ?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  6. #6
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Je l'utilise quasi sur tout le projet EntitySQL mais pour cette requête ci que j'ai simplifiée extrêmement, je préfères passer par une requête personnalisée (pour des raisons de lisibilité, maintenance, etc.)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  7. #7
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    C'est au moment de la compilation que tu as l'erreur n'est-ce pas ?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  8. #8
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Est-ce que ça ne veut pas simplement dire que Entity Framework ne sait pas faire de LIKE pour autre chose que des String ?
    On dirait bien...

    Edit
    Non c'est au moment de l'exécution
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Est-ce que ça ne veut pas simplement dire que Entity Framework ne sait pas faire de LIKE pour autre chose que des String ?
    EF n'a pas besoin de mettre en place une nouvelle méthode pour ça vu que les 3 méthodes suivantes repondent déjà à ça String.Contains, String.StartWith et String.EndWith.

  10. #10
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Oui mais ces fonctions existent quand tu fais du linq, ici je dois m'en passer... EF tente tout de même de faire des conversions (genre il connait pas convert, je suis en train de me demander s'il connait distinct, etc)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Je l'utilise quasi sur tout le projet EntitySQL mais pour cette requête ci que j'ai simplifiée extrêmement, je préfères passer par une requête personnalisée (pour des raisons de lisibilité, maintenance, etc.)
    Rien ne t'empêche aussi de créer une procédure stockée et de l'importer en tant que fonction dans EF. Ou il y a un DBA de l'autre côté qui t'en empêche ?

  12. #12
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Je pourrais en effet faire une proc stock peut être
    y'a moyen de lui passer des objets complexes ? Ici en entrée j'ai un dto avec disons une vingtaine de champs
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Je pourrais en effet faire une proc stock peut être
    y'a moyen de lui passer des objets complexes ? Ici en entrée j'ai un dto avec disons une vingtaine de champs
    Mouais je vois.

    N'oublie pas aussi les VUES aussi. Tu crées une vue (ta requête initiale sans les paramètres) tu l'importes et t'auras une entité que tu pourras interroger très facilement en lui fournissant la vingtaine de paramètres

  14. #14
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Le problème d'une vue c'est que suivant mes paramètres, j'ajoute ou non certaines tables.
    Je vais voir tout cela.

    Mais je trouve bizarre tout même ce problème de like sur un int que sql server accepte et non EF (en requête personnalisée)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  15. #15
    Invité
    Invité(e)
    Par défaut
    C'est bizarre dans ta requête initiale je vois nulle part où tu fais des if sur des paramètres pour ajouter dans la concaténation une table

  16. #16
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Oui parce que j'ai simplifier le code pour l'exemple du like int
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Oui parce que j'ai simplifier le code pour l'exemple du like int
    Dur dur la programmation

    La méthode la plus simple restera toujours la procédure stockée avec la vingtaine de paramètres.

    Uen fois la procédure importée,
    - tu te crées manuellement un type recevant les 20 paramètres : chaque paramètre une propriété
    - t'ajoutes une fonction recevant en parametres le type de classe que t'as créée et dans l'implémentation tu fais appel à ta procédure importée en lui dispatchant les paramètres provenant des différentes propriétés de ta classe.

    Bah ! Comme ça c'est facile non ? A chaque fois que tu auras besoin d'appeler ta procédure tu crées une instance de la classe et tu la passes à ta fonction qui fera appel à ta procédure.

Discussions similaires

  1. [MySQL] problème d'erreur sur requête
    Par bromlecornu dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 30/05/2007, 16h45
  2. [SQL-Server] Problème d'accents sur requête SQL, de php à SQLServer
    Par pontos dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/04/2007, 14h58
  3. Problème avec coun(*) sur une requête
    Par Kaoru-tabris dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2007, 15h00
  4. problème de doublon sur les requêtes
    Par laurent7474 dans le forum Oracle
    Réponses: 6
    Dernier message: 08/12/2006, 10h31
  5. [MSDE] Problème de groupage sur une requête
    Par joefou dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/11/2006, 09h43

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