如何编写特殊选择查询

时间:2009-08-20 08:20:17

标签: linq linq-to-sql select

我有一个帖子课:

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

帖子类中答案和问题的唯一区别是问题的parend id等于null。

我想编写一个总是返回问题的查询,无论我传递给它的答案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并且想要得到该答案的问题以及该问题的所有答案

有可能吗?

更新(遵循Jon Skeet建议):   Class Post看起来像这样:

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

如果post是一个问题,它有QuestionID等于它自己的Id,但我仍然想写一个查询来做这个,我知道写两个更容易

1 个答案:

答案 0 :(得分: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会做什么。