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
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
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
@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. –