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 :

Comment déterminer si la méthode d'extension s'exécute en .Net ou SQL


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 1
    Par défaut Comment déterminer si la méthode d'extension s'exécute en .Net ou SQL
    Bonjour

    Quand on écrit une requete linq, j'aimerais savoir comment savoir si la partie méthode d'extension (par exemple un filtre where) sera exécuté coté Base de données donc en SQL, ou si le framework récuperera toutes les données pour ensuite les filtrer

    Car pour l'exemple suivant (une table CLIENT liée à une table ORDER qui contient les commandes des clients) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDataContext.CLIENTs.Select(cc=>cc).Take(1).Single().ORDERs.Where(o => o.ORDER_MT < 233).Average(o => o.ORDER_MT);
    quand je regarde dans SQL Profiler, je m'apercois que la requete est basique, et ne contient pas de clause where pour le filtre sur le champ ORDER_MT

    Si par contre j'effectue la requete avec le langage d'expression au lieu des méthodes d'expression ,la requete SQL change et se produit en base avec le filtre where

    Merci de m'aider, est ce que ca depend de IEnumerable et IQueryable ??

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDataContext.CLIENTs.Select(cc=>cc).Take(1).Single().ORDERs.Where(o => o.ORDER_MT < 233).Average(o => o.ORDER_MT);
    En effet ta requete s'execute avec linq to object car la fonction take est de type IEnumerable et non IQueryable. Il faut donc la remplacer par Top. De plus il me semble que le select est facultatif. La requete devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDataContext.CLIENTs.Select(cc=>cc).Top(1.ToString()).Single().ORDERs.Where(o => o.ORDER_MT < 233).Average(o => o.ORDER_MT);
    Je préfère préciser que la méthode single est dans ce cas identique à la methode first mais ce n'est pas souvent le cas. En effet elle verifie que l'élément est unique dans la liste (donc execution longue) tandis que First renvoie directement le premier element.

    Ta requete peut être simplifié en remplacant Top(1.ToString()).Single() par First()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myDataContext.CLIENTs.First().ORDERs.Where(o => o.ORDER_MT < 233).Average(o => o.ORDER_MT)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2015, 19h25
  2. Comment créer une méthode d'extension sur un type
    Par Passepoil dans le forum VB.NET
    Réponses: 8
    Dernier message: 02/10/2012, 08h07
  3. Réponses: 3
    Dernier message: 27/04/2011, 15h19
  4. Réponses: 2
    Dernier message: 06/07/2004, 17h46
  5. Comment déterminer si un composant est d'un type "TMonT
    Par DanielR dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2004, 18h22

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