代码之家  ›  专栏  ›  技术社区  ›  T W

如何编写该特殊选择查询

  •  0
  • T W  · 技术社区  · 16 年前

    我有一个课后班:

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

    post类中答案和问题的唯一区别是问题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,并且想要得到那个答案的问题和那个问题的所有答案

    有可能吗?

    更新(按照jon skeet的建议): 班级帖子如下:

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

    如果post是一个问题,它的question id等于它自己的id,但是我还是想写一个查询来完成这个任务,我知道写两个查询更容易

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jon Skeet    16 年前

    编辑:使用新的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将如何理解这一点。