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

C# Discussion :

Requête dynamique et expression tree


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 957
    Points : 141
    Points
    141
    Par défaut Requête dynamique et expression tree
    Bonjour,

    Je vous beaucoup remercie de bien vouloir m'aider à comprendre le point suivant.

    A propos de requêtes dynamiques, le cours Microsoft de programmation en C# explique:

    En utilisant le langage LINQ, on peut requêter vers des données d'une l'application sans se soucier de l'implémentation de la base de données.
    Ce pendant, avec les requêts Ling statiques, on doit fournir les détails de la requête que l'on a besoin d'exécuter, lorsqu'on compile l'application.

    On peut aussi construire des requêtes dynamiquement.
    Cette approche permet d'optimiser les requêtes en leur faisant prendre forme en fonction des besoins que l'utilisateur de l'application spécifie.

    Je ne comprends pas bien ceci " avec les requêtes LINQ statiques, on doit fournir les détails de la requête que l'on a besoin d'exécuter lorsqu'on compile l'application."

    Il est également expliqué ceci
    "on peut utiliser, dans la plupart des situations des requêtes LINQ statiques, mais peuvent exister certaines situations, où certains critères de la requête tels que l'ordre de récupération des données, ou simplement lorsque les données à récupérer ne sont connues qu'à l'exécution.

    Un exemple est donné :
    "on peut avoir besoin de requêter vers une table de base de données qui stocke les resultats de tests d' étudiants .
    Cette table contient les champs suivants :nom de l'etudiant, nom du test, le resultat(score) effectué .

    On peut, sur la base de cet exemple, développer une application pour requêter vers la base de données et appliquer des filtres, en utilisant des requêtes LINQ statiques.

    Mais supposons que nous souhaitions que l'application soit plus flexible, par exemple, si l' on souhaite récupérer le contenu des trois champs de la base de données et parfois seulement deux de ces champs.

    Une des solutions sera de construire des requêtes Linq Statiques mais en utilisant des instructions de type if ou switch.

    Utiliser une requête dynamique permet de résoudre ce problème:
    Quand on développe une requête LINQ dynamque, on construit une représentation de la requête dans la forme d'une expression tree et on compile celle-ci à l'execution.
    La requête répond alors exactement au besoin de l'utilisateur.


    Ma question est la suivante : Comment une requête Linq dynamique permet de répondre à ce besoin de flexibilité?
    Comment le fait de décomposer une requête LINQ statique en utilisant des classes telles que MemberInfo, Type, BinaryExpression, ConstantExpression permet cette flexibilité?



    Ceci n'est pas très clair pour moi.
    vous remerciant encore beaucoup de votre aide sur ce point,

    Bien cordialement.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    je vais tenter d'expliquer le principe des expressions tree et du côté dynamique
    dynamique comme souvent permet de réduire le code, qui peut s'adapter à plein de situations
    mieux que du code générique c'est du code qui se créé à la compilation.

    les expressions tree bien que complexe au premier abord permettent de faire pas mal de choses
    la fois où j'ai utilisé les expressions tree c'était pour faire un remplisseur automatique de collection de classe à partir d'une base de données dont voici le pincipe :

    souvent on créé une classe qui correspond à ce qu'il y a en base (propriété = colonne)
    on instancie une collection de cette classe puis on fait une requete select, on instancie dans une boucle, on set les propriétés et on ajoute à la collection

    j'avais donc fait pour automatiser ca fait une méthode générique (au sens de c# generics) à laquelle on donnait en paramètre une collection typée (genre list<telTruc>) et une requête (string)
    le code de cette méthode générique pouvait par reflection déduire le type telTruc, puis cherchait les propriétés du même nom que les colonnes retournées par la requete (on peut connaitre les noms des colonnes et tout un tas d'infos suite à un select)
    à partir de là j'ai pu enchainer les expressions pour refaire tout le code précédement cité (faire une boucle qui instancie, qui set toutes les propriétés et qui ajoute à la collection)

    biensur tout ceci peut se faire avec seulement de la reflection, mais ca n'a rien à voir à l'exécution (la reflection une fois ca va, mais dans une boucle le temps d'exécution est énorme)
    les expressions correspondent à des lignes de code, genre créer une variable, assigner une variable, remplir une propriété d'une variable, lire un field d'une instance, appeler une méthode ...
    avec la reflection on peut récupérer les propriétés et donc créer une méthode de plusieurs étapes, liées aux données auxquelles on accède
    et une fois l'arbre d'expressions complété on peut demander une compilation et on obtient une instance de type action ou func qu'on peut alors appeler
    la compilation est assez rapide mais comme toute compilation elle peut avoir un impact, dans mon cas j'ai fait un dictionary des infos d'entrée (type telTrux) avec la méthode compilée donc à partir du 2ème appel c'est comme si le code était dans le projet de départ

    donc une ligne de code au lieu de une par propriété + 3 ou 4 (si tant est qu'on a encapsulé la lecture des données, sinon c'est plus)
    et aucune perte sur le temps d'exécution



    un autre domaine où c'est utilisable, ce sont les filtres sur un tableau, un débutant va poser des textboxes et coder en dur la colonne sur laquelle ca agit
    avec un peu de dynamisme là dessus l'utilisateur peut demander un filtre sur n’importe quelle colonne, si on connait son nom, son type et la collection de base alors un seul bloc de code peut s'occuper de tous les tableaux de l'appli


    une autre solution est de compiler du code c# pendant l'exécution, à partir d'un string, là aussi on peut récupérer un action ou un func, ou même un type ... ca se fait avec codedom
    c'est un peu plus long que les expressions à compiler je crois, après tout c'est une dll qui est générée, qu'on ajoute en référence dans l'appdomain et qu'on peut alors utiliser
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 13h31
  2. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 16h12
  3. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 15h29
  4. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 17h04
  5. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 10h39

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