2009-08-20 37 views
0

我有一个职位等级:如何编写特殊的选择查询

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

在后级的答案和问题之间的唯一区别是,问题有parend ID等于空。

我想写一个查询,它总是返回问题,它的答案,不管我传递给它的ID问题或答案 的ID。例如:

我有ID = 1,不知道它的答案或问题的ID,但如果它是问题ID我想从交类问题和答案

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

但如果ID = 1是答案的ID,并希望得到这个问题的答案的问题,所有的该问题的答案

是有可能吗?

更新(以下乔恩斯基特建议): 类岗位看起来像这样:

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

如果后一个问题已经QuestionID等于它自己的ID,但我仍然想编写一个查询要做到这一点,我知道这是比较容易写两个

+0

请参阅我的编辑 - 我已将提示单个查询移至答案的顶部。 – 2009-08-20 08:45:36

回答

1

编辑:随着新QuestionID领域,而不是,我怀疑这会工作:

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

(您可能想要尝试扭转的加入顺序,看看是否会影响生成的SQL查询计划。)


(原来的问题用一个可空PARENTID场,而不是QuestionID。)

你绝对有做一个查询吗?我敢肯定,这将是可能的,但它可能会比分裂它丑陋:

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); 

有一点需要注意:如果你可以从“PARENTID”到“QuestionID”改变,使之不可以为空,这样一个问题的自己的 ID作为QuestionID,查询会变得更简单一些。


如果你真的想这样做在一个查询中,你可以能够做到这一点是:

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; 

我不知道是什么的LINQ to SQL将会使尽管如此。

+0

谢谢,我还有一个问题,这些查询的性能如何,最好我想写一个查询来做到这一切,但保持尽可能简单,所以当用户浏览带问题ID的问题时,我只运行一个查询,但是当错误地通过answer id来浏览我也想得到处理。(对不起,我的英文版) – 2009-08-20 08:42:29

+0

我不想猜测演出。有了合适的索引,它应该是相当不错的。试试看看 - 然后看看查询计划。 – 2009-08-20 08:54:37