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

Linq Discussion :

Quand dois-je utiliser Expression<Func<T>> au lieu de Func<T> ?


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Par défaut Quand dois-je utiliser Expression<Func<T>> au lieu de Func<T> ?
    Bonjour,

    Je voulais savoir à quel moment il est nécessaire de déclarer un paramètre en définissant une Expression et non une Fonction.

    Par exemple, ici que ce soit l'un ou l'autre, cela ne change pas beaucoup le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public string IntToString(Expression<Func<int, string>> toString, int value)
    {
        return toString.Compile()(value);
    }
     
    public string IntToString(Func<int, string> toString, int value)
    {
        return toString(value);
    }
    Je pose la question car pour les IEnumerable, les ICollection, les IQueryable, les méthodes Select, Where, OrderBy, etc... attendent une Expression et non une fonction. Du coup, je me demande dans quels cas, il faut utiliser une Expression en paramètre et non une fonction.

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Une expression contient les appelles sous la forme d'un arbre, elle peut donc être utilisé pour autre chose qu'une simple exécution du code.

    Par exemple EntityFramework n'exécute pas ces expressions mais les convertie en code SQL

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Par défaut
    Ah merci beaucoup pour cet éclaircissement anthyme !
    Je comprends mieux le fonctionnement de certaines méthodes, comme OrderBy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyEntityCollection.OrderBy(e => e.Id);
    Ici, si je me trompe pas, la méthode OrderBy va récupérer le nom de la propriété retournée pour faire le tri (ici, la chaine "Id"), et non la valeur. Ensuite, je suppose que c'est par Reflexion que le tri est effectué sur la collection.

  4. #4
    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 Gat- Voir le message
    Je pose la question car pour les IEnumerable, les ICollection, les IQueryable, les méthodes Select, Where, OrderBy, etc... attendent une Expression et non une fonction. Du coup, je me demande dans quels cas, il faut utiliser une Expression en paramètre et non une fonction.
    Euh, non... les méthodes Select, Where, OrderBy etc de la classe Enumerable (qui s'appliquent à IEnumerable) prennent des Func<...> ; celles de la classe Queryable (qui s'appliquent à IQueryable) prennent des Expression<Func<...>>.

    Comme l'a dit anthyme, les expressions ne sont pas du code exécutable mais une représentation de ce code (arbre syntaxique ou abstract syntax tree). Cette représentation peut être analysée pour "traduire" la requête Linq en autre chose (requête SQL, HTTP, autre...)

    Citation Envoyé par Gat- Voir le message
    Je comprends mieux le fonctionnement de certaines méthodes, comme OrderBy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyEntityCollection.OrderBy(e => e.Id);
    Ici, si je me trompe pas, la méthode OrderBy va récupérer le nom de la propriété retournée pour faire le tri (ici, la chaine "Id"), et non la valeur. Ensuite, je suppose que c'est par Reflexion que le tri est effectué sur la collection.
    Ben ça dépend...

    Si MyEntityCollection implémente IQueryable, c'est le provider Linq sous-jacent (par exemple Entity Framework) qui va traduire l'appel à la méthode Queryable.OrderBy (par exemple en une instruction SQL ORDER BY dans le cas d'EF)

    Si MyEntityCollection implémente IEnumerable, c'est la méthode Queryable.OrderBy qui est utilisée, la lambda expression e => e.Id est donc convertie en delegate (Func<TSource, TResult>) et non en expression tree (Expression<Func<TSource, TResult>>). C'est donc du code directement exécutable : OrderBy va donc exécuter le delegate sur chaque élément de la collection pour obtenir l'ID et trier en comparant les ID

    Par contre la réflexion n'a rien à voir là-dedans, dans un cas comme dans l'autre...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Par défaut
    Ah désolé désolé, j'ai généralisé car dans mon cas, il s'agissait d'IQueryable...
    Maintenant, je vois bien la différence entre une Expression et une Func... mais aussi toutes les possibilités que cela offre !

    Pour m'exercer, je vais tenter de trouver des cas où il est nécessaire d'utilisé des Expressions et non des Func. Bon je n'en ai pas en tête actuellement mais je vais bien trouver.

    Merci tomlev et anthyme !

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Par défaut
    Très intéressant. Pourras tu si possible ajouter tes exemples à ce post une fois trouvé ? Car si tu comprends bien la différence, pour moi, c'est un peu plus confus. Alors un petit exemple m'aidera beaucoup à appréhender ce concept un peu flou pour moi.

    Merci d'avance !

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/03/2022, 12h45
  2. Dois je utiliser Xml ?
    Par shaudron dans le forum XML/XSL et SOAP
    Réponses: 11
    Dernier message: 07/03/2006, 19h01
  3. [C#] Quand et où utiliser les exceptions ?
    Par wiLL_ dans le forum C#
    Réponses: 3
    Dernier message: 12/02/2006, 17h34
  4. Réponses: 5
    Dernier message: 20/10/2005, 10h42
  5. Quand il faut utiliser TTAble et un TQuery
    Par denza1 dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/06/2004, 18h29

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