2009-08-20 8 views
0

J'ai une classe post:Comment écrire cette requête sélection spéciale

class Post 
{ 
public int ID; 
public int? ParentID; 
} 

La seule différence entre réponse et question en classe post est cette question a id parend est égal à zéro.

Et je veux écrire une requête qui retourne toujours question et il est des réponses, peu importe je passe à elle ID de question ou ID de réponse par exemple:

Je ID = 1 et je ne sais pas il est ID de réponse ou une question, mais s'il est question ID je veux obtenir cette question et les réponses de la classe post

var selectquestionbyquestionid= from p in posts where p.ParentID==id || p.ID==id select p; 
(it's query only for first variant) 

mais si ID = 1 est ID de réponse et que vous voulez obtenir question de cette réponse et tout les réponses à cette question

Est c'est possible?

mise à jour (suite de conseils Jon Skeet): semble classe post comme ça:

class Post 
    { 
    public int ID; 
    public int QuestionID; 
    } 

Et si après est une question, il a QuestionID égal à son propre Id, mais je voudrais écrire un requête pour ce faire, je sais qu'il est plus facile d'écrire deux

+0

Voir mes modifications - J'ai déplacé la suggestion de suggestion unique en haut de la réponse. –

Répondre

1

EDIT: Avec le nouveau champ de QuestionID à la place, je pense que cela fonctionne:

var query = from post in posts 
      where post.ID == id 
      join related in posts on post.QuestionID equals related.QuestionID 
      select related; 

(Vous pouvez essayer d'inverser l'ordre de la jointure pour voir si cela influe sur le plan de requête pour le SQL généré.)


(La question initiale a utilisé un champ ParentID annulable au lieu de QuestionID.)

Avez-vous absolument avoir pour le faire en une seule requête? Je suis sûr que ce sera possible, mais il est susceptible d'être plus laid que la découper:

var post = posts.Where(p => p.ID == id) 
       .FirstOrDefault(); 

if (post == null) 
{ 
    // No such question - deal with it 
} 
int questonID = post.ParentID ?? post.ID; 

var allPosts = posts.Where(p => p.ID == questionID || p.ParentID == questionID); 

Une chose à noter: si vous pouviez changer de « ParentID » à « QuestionID » et de le rendre non nullable, de sorte qu'une question avait son propre ID comme QuestionID, les requêtes deviendraient un peu plus simples.


Si vous vraiment voulez faire dans une requête, vous pouvez être en mesure de le faire comme:

var query = from post in posts 
      where post.ID == id 
      let questionID = post.ParentID ?? post.ID 
      from related in posts 
      where related.ID == questionID || related.ParentID == questionID 
      select related; 

Je ne sais pas ce que LINQ to SQL fera de cela cependant.

+0

Merci, j'ai encore une question, qu'en est-il de la performance de ces requêtes, de manière optimale je voudrais écrire une requête pour faire tout cela, mais garder le plus simple possible, donc lorsque l'utilisateur parcourez la question avec l'ID de la question quand par erreur parcourir par réponse id je veux obtenir gérer cela aussi.(désolé pour mon anglais) –

+0

Je ne voudrais pas deviner à la performance. Avec des index appropriés, il devrait être plutôt bon. Essayez et voyez - et regardez le plan de requête. –

Questions connexes