2013-06-20 98 views
1

我有一個看起來很簡單的任務,我比我承認要做的事情要麻煩得多。我有一個分層表,我需要查詢和顯示父母與關聯的孩子分組的結果。LINQ由ParentId分組

我現在的LINQ查詢:

var quests = Questions.Include(q => q.Question2) 
     .Include(q => q.Sections) 
     .Include(q => q.QuestionType) 
     .Include(q => q.AnswerOptions) 
     .Where(sq => sq.Sections.Any(s => s.SectionId == sectionId)) 
     .OrderBy(q=> q.QuestionId).ThenBy(q => q.ParentQuestionId); 

這將產生一個結果集:

enter image description here

我想製作的是:

enter image description here

我的問題簡單地說,如何c我使用Lambda語法獲得了期望的結果。

+0

訂單是我看到的唯一區別嗎? –

+0

'OrderBy(q => q.ParentQueryId).ThenBy(q => q.QuestionId)'得到你想要的嗎? –

+0

謝謝Servy在圖像中添加。我還沒有足夠的代表。 :) –

回答

2

更新基於Servys的評論。

第一行是確保所有相關的問題都組合在一起。 第二行是確保父母的問題是第一位的。 第三行是訂購正確

.OrderBy(q => q.ParentQuestionId == null ? q.QuestionId : q.ParentQuestionId) 
.ThenBy(q => q.ParentQuestionId == null ? 0 : 1) 
.ThenBy(q => q.DisplayOrder); 
+1

從外觀上看,這可能適用於OP的具體數據,但並未解決根本問題,因爲它依賴於可能不成立的假設。請注意,他基本上正在嘗試構建一棵樹,每個孩子都會跟隨它的父母或更年長的兄弟姐妹。 – Servy

+0

太棒了!那就是訣竅。謝謝! –

+0

@Servy - 你是對的..雖然這確實有助於快速修復,但一旦樹結構增長到多個層次,它可能會中斷。我現在可以快速修復。我感謝所有的幫助! –

-1
.OrderBy(x => (x.ParentQuestionId==null?x.QuestionId:x.ParentQuestionId.Value)); 
+0

這似乎沒有產生所需的結果。通知問題265. – Servy

+0

是的,我嘗試了,因爲你和牛排建議,但它沒有幫助。謝謝。 –

+0

編輯修正爲null –

1

這麼看來,你其實想在這裏建立是基於樹結構,其中,在最頂層,你有沒有父的所有問題,然後爲「孩子」將所有以父母身份出現的問題都列出來。

var questions = GetAllQuestions();//here is where you can put your includes, etc. 

var query = questions.Where(q => q.ParentQuestionId != null) 
    .GroupBy(q => q.ParentQuestionId) 
    .Select(group => new 
    { 
     Parent = questions.First(q => q.QuestionId == group.Key), 
     Children = group.OrderBy(q => q.DisplayOrder), 
    }) 
    .OrderBy(group => group.Parent.DisplayOrder); 
+0

我接受快速解決方案的答案,但你的證據確實很有前途。感謝您的及時幫助! –