2010-01-07 6 views
1

hey all. Juste vouloir savoir est-ce la manière la plus efficace d'obtenir des valeurs d'un db: donné;linq-to-sql est-ce le code le plus efficace?

----------- --------------- ------------- 
| Channel | |Issue  | |Topic  | 
| path(ck)| |channelID(fk)| |issueID(fk)| 
----------- --------------- ------------- 
  • Un canal a beaucoup de questions
  • Une question a de nombreux sujets
  • chemin
  • est une clé alternative

J'ai écrit la statment LINQ suivante.

var content = (from c in db.Channels 
where c.channel_holding_page == path 
select new { c, _latestIssue = c.Issues.OrderBy(i => i.issue_created).Where(i => i.issue_isVisible == true).FirstOrDefault(), _topics = c.Issues.OrderBy(i => i.issue_created).Where(i => i.issue_isVisible == true).FirstOrDefault().Topics }).FirstOrDefault(); 

Je veux obtenir (travailler en arrière ici) tous les sujets liés à la dernière édition (issue_created) qui est configurée pour être publique (issue_isVisible) dudit canal.

Est-ce le moyen le plus efficace ou existe-t-il une méthode plus rapide que celle-ci?

+0

Une sous-requête est répétée deux fois. Peut-être serait-il un peu plus facile de comprendre si cela faisait l'objet d'une déclaration distincte. Cela n'entraînera toujours pas de voyage supplémentaire dans la base de données. – Tarydon

Répondre

1

Parfois, l'interrogation fonctionne bien vers le bas, et vous pouvez forer jusqu'à, comme dans:

from t in Topic 
join i in issues 
on t.IssueID equals i.IssueID 
join c in channels 
on i.ChannelID equals c.ChannelID 
where c.Chanel_holding_path == path 
select new 
{ 
    i.issue_visible, 
    c.channelid, 
    t.topicID 
} 

pas exact, mais vous obtenez l'image. Vous pouvez forer, ce qui facilite le travail avec des objets.

+0

Le code est beaucoup plus propre que vous l'avez dit. Je suis d'accord que ce n'est pas exactement le même résultat que mon exemple ci-dessus mais tout ce que je voulais était une méthodologie merci :) – Kieran

0

Je pense que c'est ce que votre code tente d'accomplir:

 var channels = db.channels.Where (c => c.channel_holding_page == path); 
    var issues = channels.Select (c => new { c, _latestIssue = c.Issues.Where (i => i.issue_isVisible).OrderBy (i => i.issue_created).FirstOrDefault() }); 
    var result = issues.Select (ci => new { ci.c, ci._latestIssue, ci._latestIssue.Topics }).FirstOrDefault(); 

S'il n'y aura qu'un seul canal qui correspondra à la vérification de channel_holding_page, nous pouvons simplifier un peu plus puisque les canaux var peut être aplati en utilisant un droit FirstOrDefault() dans la première ligne.

+0

serait alors lié à 3 appels distincts à la DB? – Kieran

+0

Non, juste un. C'est seulement lorsque vous essayez de retirer des objets des enquêteurs (comme les canaux, les problèmes, les résultats) que la requête est réellement exécutée. – Tarydon

0

Je suppose que lorsque vous changez les places de .Where et .OrderBy cela va accélérer la requête un peu.

+0

ffs qui a donné un moins? commentaires sur ce s'il vous plaît – citronas

Questions connexes