2009-11-14 7 views
0

J'ai une requête Linq To Sql sur mon site Web asp.net.Linq Query - comment pouvez-vous améliorer la requête suivante?

Cette requête fonctionne aussi Lent et je suis sûr qu'il peut être amélioré.

Quelqu'un peut-il m'aider à écrire cette requête?

Je suppose que l'utilisation de "joindre" le rendrait plus rapide mais ne pourrait pas le faire correctement. :(


Voici la requête: (params d'entrée: INT_GENDER).

var users = from u in db.Users 
      where (u.gender == INT_GENDER) && (u.age > 25) 
      let fileId = (from f in db.Files 
         where f.username == u.username && f.approved 
         orderby f.primary 
         select f.id).FirstOrDefault() 
      let answer = (from a in db.Answers 
          where (a.username == u.username) && 
           (a.q_id == (from q in db.Questions where q.type == 1 
                select q.id).FirstOrDefault()) && 
            a.approved 

          select a).FirstOrDefault() 

select new { 

    Username = u.u_username, 
    FileId = fileId !=null ? fileId : GetEmptyFileId(), 
    Answer = (answer == null ? "" : (answer.approved ? answer.value: "Empty")) 
}; 

requête est basée sur 3 tables Tables: 1. Les utilisateurs 2. Fichiers 3. Réponses

  • colonne Nom d'utilisateur dans la table des utilisateurs est l'identité.
  • Chaque utilisateur peut avoir plusieurs ou aucun fichiers
  • Chaque utilisateur peut avoir beaucoup ou pas de réponses.

Merci! Dan

+0

INT_GENDER ?? Pourquoi pas booléen si tout ce que vous utilisez est masculin ou féminin. Aussi, pour de meilleures performances, utilisez un proc stocké. C'est parce que les procédures stockées mettent en cache le plan d'exécution, ce qui est très utile pour une récupération rapide. – AboutDev

+0

merci. 1. INT_GENDER peut être 0,1,2. 2. Je préfère rester avec linq, je sais que je peux aussi en faire une requête conforme, mais je cherchais à écrire une meilleure requête en premier. – dan

+0

@AboutDev Les requêtes préparées (comme celle utilisée dans LINQ to SQL) ont également leur plan d'exécution mis en cache. La légende urbaine sur cette supériorité des procs stockés vieillit. –

Répondre

0

Voici ma modeste tentative de déchiffrer ceci en langage T-SQL. J'espère que cela t'aides.

SELECT u.username, f.id, a.value, a.approved 
FROM users AS u 
    JOIN files AS f ON u.username = f.username 
    JOIN answers AS a ON a.username = u.username 
    JOIN questions AS q ON a.q_id = q.id  
WHERE u.gender = @INT_GENDER 
     AND u.age > 25 
     AND f.approved = 1 
     AND a.approved = 1 
     AND q.type = 1