2009-08-20 4 views
0

У меня есть пост класс:Как написать, что специальный запрос на выборку

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

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

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

У меня есть ID = 1, и не знаю, что это идентификатор ответа или вопрос, но если это вопрос 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 является идентификатор ответа и хочет получить вопрос этого ответа и все ответы на этот вопрос

Is Возможно ?

Update (после консультации Джон Скит): Class Сообщение выглядит следующим образом:

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

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

+0

См. Мое редактирование. Я переместил запрос на один запрос в начало ответа. –

ответ

1

EDIT: с новым полем 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» и сделать его не- null, так что у вопроса был собственный 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 к SQL будет делать из это все же.

+0

Спасибо, у меня есть еще один вопрос, как насчет выполнения этих запросов, оптимально я хотел бы написать один запрос, чтобы сделать все, но сохранить его как можно проще, поэтому, когда пользователь просматривает вопрос с идентификатором вопроса, я запускаю только один запрос, но когда по ошибке просматривайте по ответу id, я тоже хочу обработать.(извините за мой inglish) –

+0

Я бы не хотел догадываться о производительности. С подходящими индексами это должно быть довольно неплохо. Попробуйте и посмотрите - и посмотрите на план запроса. –

Смежные вопросы