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 :

Clause Where en link to entity


Sujet :

Entity Framework

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 77
    Points
    77
    Par défaut Clause Where en link to entity
    Avec ADO.NET , je mettais en forme mes clauses WHERE et ORDER BY dans une chaine de caracteres avec string builder suivant le La selection de la recherche.
    Exemple :
    string StrSelect = "SELECT * FROM TABLE"
    string StrWhere = " Where a = 1 AND C = 2"
    string StrOderBy = " Order by a"
    et ma requete etait : StrSelect + StrWhere + StrOderBy.

    existe t il un moyen de faire pareil avec Link to Entity ?
    J'ai essaye mais je pense que cela n'est pas possible.
    Merci de Votre Confirmation
    Anthride

  2. #2
    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
    Je ne comprends pas la question...
    Avec Linq to Entity tu n'es pas censé écrire de requête à la main, tu procèdes de façon "dynamique".

    Par exemple :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    var results = from u in context.Users where u.id > 4000 select u.LastName;
    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 --

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 77
    Points
    77
    Par défaut
    Mes requetes peuvent faire des centaines de caracteres suivant la selection demandée.

    J'ai un formulaire de recherche d'un ou plusieurs produits.
    J'ai une vingtaine de criteres de selection ( Fournisseur , collection , famille .... etc)
    plus une vingtaine de critere de tri .
    Suivant la saisie du formulaire , j'alimente un string avec des AND ou des Or

    et j'envoie une seule rquete a la fin de mon formulaire.
    Juste pour eviter d'avoir des centaires de
    "var results = from u in context.Users where ..... select ........ ;

    Je peux toujours garder mon ancienne methode. Je ne suis pas blocqué. mais j'aurais aime n'avoir que du Link dans mon Code.

    Anthrid

  4. #4
    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
    A priori l'un n'empêche pas l'autre...

    Peux-tu fournir un exemple de requête ? (Qui soit quand même compréhensible...)
    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 --

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    En utilisant la forme plus "method-call-style" de linq, tu peux peut-être retrouver ta logique de construction...

    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var res1 = context.Table.Where(t=>t.val == 2);
    var res2 = res1.OrderBy(r1=>r1.name);
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
     
    //Jusque là aucune requête ne devrait être lancée
     
    var res = res3.ToArray(); //claquage de requête
    Tu ne peux peut être pas être aussi fin qu'avec une requête SQL (je pense surtout à tous les "where a=1 and b=2 or(b=3 and c=5)" où tu es obligé de tout faire en même temps), mais on s'en approche et c'est plus propre je trouve...

    Sinon, dan slinq to EF, il y a moyen d'envoyer des requêtes SQL (jamais fait)... Mais du coup, je troyuve qu'on perd un peu l'intérêt.

    A+

  6. #6
    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
    Je peux me tromper, mais pour moi ça serait plutôt ça :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var res1 = context.Table.Where(t=>t.val == 2);
    // La requête s'exécute : Linq to SQL
    var res2 = res1.OrderBy(r1=>r1.name);
    // Pas de requête à la base, tu tries dans ton objet : Linq
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
    // Pas de requête à la base, tu tries dans ton objet : Linq
    var res = res3.ToArray();
    // Parse en Array

    En effet, si tu ne parse pas ton résultat, ce qui est tout à fait possible car rien ne t'empêche d'exploiter des IQueryable<User> (par exemple), tu auras bien un résultat dans ta collection.
    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 --

  7. #7
    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
    Citation Envoyé par Er3van Voir le message
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var res1 = context.Table.Where(t=>t.val == 2);
    // La requête s'exécute : Linq to SQL
    var res2 = res1.OrderBy(r1=>r1.name);
    // Pas de requête à la base, tu tries dans ton objet : Linq
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
    // Pas de requête à la base, tu tries dans ton objet : Linq
    var res = res3.ToArray();
    // Parse en Array
    Effectivement tu te trompes :p la requete n'est effectuée que sur le Select

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Désolé, mais elle s'effectue bien à la fin, je viens de vérifier. (au moment du ToArray())
    C'est l'avantage du IQueryable

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 77
    Points
    77
    Par défaut
    Merci de votre aide, votre methode va peut etre m'interesser , mais mon Link to entity n'etant pas a votre niveau , j'ai quelque petits problemes.

    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
          using (ProduitEntities ContextProd = new ProduitEntities())
                {
     
                    var res1 = ContextProd.ProdGestions.Where(t=>t.Pro_CodFou == "RO");
                    var res2 = res1.OrderBy(r1=>r1.Pro_CodPro);
                    var res3 = res2.Select(r2=>r2.Pro_Despro);
                    var result = res3.ToArray();
     
                    foreach (string iii in result)
                    {
                        string despro = iii.ToString();
                    }
     
                }
    - deja dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
    on me dit que string.format n'est pas reconnu par LINK.

    - Je voudrais que res3 soit mon entity (ma Table) complete : ProdGestion , comment dois je l'ecrire.

    - Si non cette methode peut etre interressante si je peus faire des requetes en cascade. c'est a dire recuperer le result et refaire une requete suivant un test.
    Anthride

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par anthride Voir le message
    - deja dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
    on me dit que string.format n'est pas reconnu par LINK.
    Je crois qu'on ne peut pas utiliser des fonctions "à l'intérieur" de linq. (en tout cas pas en C#). De plus il y a une erreur de syntaxe, il faudrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string.Format("{0} {1}",r2.Name,r2.FirstName)
    Citation Envoyé par anthride Voir le message
    - Je voudrais que res3 soit mon entity (ma Table) complete : ProdGestion , comment dois je l'ecrire.
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     var res1 = ContextProd.ProdGestions.Where(t=>t.Pro_CodFou == "RO");
                    var res2 = res1.OrderBy(r1=>r1.Pro_CodPro);
                    var res3 = res2.Select(r2=>r2);
                    var result = res3.ToArray();
    ou même ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     var res1 = ContextProd.ProdGestions.Where(t=>t.Pro_CodFou == "RO");
                    var res2 = res1.OrderBy(r1=>r1.Pro_CodPro);
                    var result = res2.ToArray();

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 77
    Points
    77
    Par défaut
    Merci de ton aide.

    Donc j'arrive a avoir ce que je veux ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                using (ProduitEntities ContextProd = new ProduitEntities())
                {
     
                    var res1 = ContextProd.ProdGestions.Where(t=>t.Pro_CodFou == "RO");
                    var res2 = res1.OrderBy(r1=>r1.Pro_CodPro);
                    var res3 = res2.Select(r2=>r2);
                    var result = res3.ToArray();
     
                    foreach (ProdGestion UnProd in result)
                    {
                        string despro = UnProd.Pro_Despro;
                    }
     
                }
    Je valide ta reponse . mais j'aurai surement encore besoin d'aide

    Anthride

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    var res3 = res2.Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName);
    L'erreur est normal et n'a rien à voir avec LINQ en lui même.

    Le problème c'est qu'au moment ou vous faites celà, res2 est encore lié à la base de donnée... c'est donc du LINQ to SQL...
    Or String.format ne peut être traduit par LINQ en requête SQL...

    En revanche si vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var res3 = res2.ToList().Select(r2=>string.Format("{0} {1}",r2.Name + r2.FirstName)
    Cela devrait fonctionner car res2.ToList() commence par effectuer la requête SQL... la partie .select est donc maintenant du LINQ TO OBJECT... lui connaîtra string.format.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  13. #13
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par iberserk Voir le message
    L'erreur est normal et n'a rien à voir avec LINQ en lui même.

    Le problème c'est qu'au moment ou vous faites celà, res2 est encore lié à la base de donnée...
    Mais oui !! C'est la différence entre un IQueryable et un IEnumerable !! Merci, je viens de connecter...

  14. #14
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Mais oui !! C'est la différence entre un IQueryable et un IEnumerable !! Merci, je viens de connecter...
    Oui même si un IQueryable n'est pas forcément lié à une base de données...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Oui même si un IQueryable n'est pas forcément lié à une base de données...
    Oui il stocke juste un arbre de requête avant exécution. Exactement ce que veut faire anthride.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2017, 10h35
  2. [Débutant] Entity Clause Where et répéteur
    Par Pelote2012 dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 23/04/2012, 16h45
  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