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 :

[C#] from A in As from B in Bs from C in Cs en dynamic


Sujet :

Linq

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut [C#] from A in As from B in Bs from C in Cs en dynamic
    Bonjour,
    j’aimerai pouvoir optimiser mes jointure faite dynamiquement,
    en effet le code qui suit est quelque peu lent, ce qui nuit a l'utilisation du soft.
    J'ai vu sur des forums qu'il était possible de faire de multiple inner join sur une même table de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from A in As 
    from B in Bs
    from C in Cs
    where A.ID == B.ID || A.ID == C.ID select A
    J'aimerrai pouvoir faire de même mais de façon dynamique via une methode, laquelle je ne trouve pas.


    Voici mon code de base que j'aimerrai optimiser :

    Code : 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
     
                IQueryable<Souscription> baseReq = req;
                req = null;
                foreach (var item in ModeSouscriptions)
                {
                    if (item is ModeSouscriptionAgence)
                    {
                        IQueryable<Souscription> souReq = from souscription in baseReq
                                                          join mode in Context.ModeSouscription.OfType<ModeSouscriptionAgence>()
                                                           on souscription.ModeSouscription_ModeSouscriptionID equals mode.ModeSouscriptionID
                                                          select souscription;
                        if (req == null)
                            req = souReq;
                        else
                            req = req.Union(souReq);
                    }
                    else if (item is ModeSouscriptionCourrier)
                    {
                        IQueryable<Souscription> souReq = from souscription in baseReq
                                                          join mode in Context.ModeSouscription.OfType<ModeSouscriptionCourrier>()
                                                           on souscription.ModeSouscription_ModeSouscriptionID equals mode.ModeSouscriptionID
                                                          select souscription;
                        if (req == null)
                            req = souReq;
                        else
                            req = req.Union(souReq);
                    }
    }
    Merci, a bientôt

  2. #2
    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 : 43
    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
    Par défaut
    Peut'on voir la structure de vos tables?

  3. #3
    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 : 43
    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
    Par défaut
    en effet le code qui suit est quelque peu lent, ce qui nuit a l'utilisation du soft.
    Evidemment vous faites des requêtes dans une boucle!

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Euh...

    Quelle est l'utilité d'exécuter toujours la même requête (donc toujours le même résultat à chaque tour de boucle ?

    Dans le code donné qu'est-ce qui change à chaque tour ?
    • Item : qui n'est utilisé que pour son type
    • req qui est alimenté par le union via les soureq


    Essaye de retirer la boucle !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut
    Merci de ces réponses,
    je vais essayer de supprimer la boucle, mais étant donné que c'est de l'linq to entities, normalement la requette est exécuter uniquement quand j'utilise le IQueryable (donc la boucle ne pause pas de problème), le Union est une source d’exécution SQL croyez-vous ?
    En générale je fais un ToList() après la construction de mon IQueryable pour exécuter ma requette en SQL.


    Pour la structure de la table, j'utilise l'abstraction fourni par EF pour tester le type d'une classe abstraite (je trouve cela pas mal).

    Je propose de filtrer selon les types dérivé de la classe de base qui elle est stocké dans une table comme un simple champ.
    Donc pour filtrer je fait des jointures internes avec les tables des classe dérivés.
    La liste de filtre est aléatoire , c'est pour cela que j'utilise une boucle.
    Le problème de la jointure interne est que je suis obligé de faire un union pour joindre ma requette sur plusieurs table d'un même champ.


    Voici une autre version, mais qui m'oblige a faire un Distinct en fin de requette ce qui réduit également les performances. Quand même moins que la version précèdent, mais c'est toujours pas ça.

    Code : 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
     bool isModeSouscriptionAgence = false;
                bool isModeSouscriptionCourrier = false;
                bool isModeSouscriptionMail = false;
     
                foreach (var item in ModeSouscriptions)
                {
                    if (item is ModeSouscriptionAgence)
                        isModeSouscriptionAgence = true;
                    else if (item is ModeSouscriptionCourrier)
                        isModeSouscriptionCourrier = true;
                    else if (item is ModeSouscriptionMail)
                        isModeSouscriptionMail = true;
                }
     IQueryable<Souscription> req = from souscription in souscriptionSituations
                                               from modeSouscriptionAgence in Context.ModeSouscription.OfType<ModeSouscriptionAgence>()
                                               from modeSouscriptionCourrier in Context.ModeSouscription.OfType<ModeSouscriptionCourrier>()
                                               from modeSouscriptionMail in Context.ModeSouscription.OfType<ModeSouscriptionMail>()
                                               where (souscription.ModeSouscription_ModeSouscriptionID == modeSouscriptionAgence.ModeSouscriptionID && isModeSouscriptionAgence == true)
                                               || (souscription.ModeSouscription_ModeSouscriptionID == modeSouscriptionCourrier.ModeSouscriptionID && isModeSouscriptionCourrier == true)
                                               || (souscription.ModeSouscription_ModeSouscriptionID == modeSouscriptionMail.ModeSouscriptionID && isModeSouscriptionMail == true)
                                               select souscription;
    req.Distinct().ToList();

    Quand je fait un test de performance 30% de l’exécution ce fait dans req.Distinct().ToList();
    Merci.

  6. #6
    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 : 43
    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
    Par défaut
    Peut'on voir la structure de vos tables?

  7. #7
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Citation Envoyé par neoncyber Voir le message
    je vais essayer de supprimer la boucle, mais étant donné que c'est de l'linq to entities, normalement la requette est exécuter uniquement quand j'utilise le IQueryable (donc la boucle ne pause pas de problème),
    Les choses inutiles font perdre du temps en général après je ne connais pas le détail de la mécanique interne du linq to sql mais moi moins j'en fais moins ça me prend de temps !

    Pour ça, je dirais que ça ne sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       foreach (var item in ModeSouscriptions)
                {
                    if (item is ModeSouscriptionAgence)
                        isModeSouscriptionAgence = true;
                    else if (item is ModeSouscriptionCourrier)
                        isModeSouscriptionCourrier = true;
                    else if (item is ModeSouscriptionMail)
                        isModeSouscriptionMail = true;
                }
    Et pour la requête simplement ça, ça ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IQueryable<Souscription> req = from souscription in souscriptionSituations
                                               from modeSouscription in Context.ModeSouscription
                                               where (souscription.ModeSouscription_ModeSouscriptionID == modeSouscription.ModeSouscriptionID
                                     select souscription;

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut
    Voici la structure de mes tables


  9. #9
    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 : 43
    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
    Par défaut
    Confirmez moi ce que vous voulez faire:
    Vous avez trois tables (qui se retrouve être de l'heritage une fois dans ENTITIES) et en fonction de 3 booleans (j'image....) vous voulez retourner l'union des tables ?

  10. #10
    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 : 43
    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
    Par défaut
    Voici la structure de mes tables
    Ce n'est pas une structure de table çà mais votre "modèle" LINQ TO ENTITIES

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

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. DELETE FROM t where t.id IN (SELECT id FROM t....)
    Par davcha dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/01/2006, 15h19
  3. SYBASE SELECT imbriqué clause FROM
    Par Nicolas Martel dans le forum Sybase
    Réponses: 2
    Dernier message: 19/11/2003, 15h28
  4. Automatiser la mise à jour de la bD SQL SERVER from Access
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2003, 15h23
  5. equivalent de select nextval from dual en SQL-Server ?
    Par toze dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2003, 09h17

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