Как написать этот специальный запрос выбора - PullRequest
0 голосов
/ 20 августа 2009

У меня есть сообщение класса:

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

Единственное различие между ответом и вопросом в классе записей заключается в том, что вопрос имеет идентификатор parend, равный нулю.

И я хочу написать один запрос, который всегда возвращает вопрос и его ответы, независимо от того, передаю ли я ему идентификатор вопроса или идентификатор ответа например:

У меня есть 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 выглядит так:

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

И если сообщение является вопросом, оно имеет QuestionID, равный его собственному идентификатору, но все же я хотел бы написать один запрос для этого, я знаю, что легче написать два

1 Ответ

1 голос
/ 20 августа 2009

РЕДАКТИРОВАТЬ: с новым полем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...