2011-07-27 40 views
0

我想從現有的數據庫設計構建一個這樣的調查引擎。由一個實體Linq組,然後由分組(可空)實體排序

Survey - Not so Relavent 
======================== 
SurveyID 
SurveyName 

SurveyQuestionCategories 
========================= 
SurveyQuestionCategoryID 
SurveyQuestionCategory 
SurveyID 
RecordOrder 

SurveyQuestions 
================ 
SurveyQuestionID 
SurveyQuestion 
SurveyID 
SurveyQuestionCategoryID 
RecordOrder 

基本上總是會有的一個調查,但調查可能會或可能不會有問題的類別問題清單。我想要做的是有一個linq查詢,它將按類別(如果存在的話)對調查提出所有問題,並按類別記錄順序(如果它們存在)排序,然後按問題記錄順序排序。到目前爲止,我有這樣的事情。 (只是假設變量CurrentSurvey保持表示當前顯示調查的實體)

 Dim AllQuestions = From sq In CurrentSurvey.SurveyQuestions 
         Order By sq.RecordOrder 
         Group sq By Key = sq.SurveyQuestionCategory Into Group 
         Select QuestionCategory = Key, Questions = Group 

這正常的分組處理由NULL SurveyQuestionCategory分組。現在的問題是當我將查詢更改爲此。

Dim AllQuestions = From sq In CurrentSurvey.SurveyQuestions 
        Order By sq.RecordOrder 
        Group sq By Key = sq.SurveyQuestionCategory Into Group 
        Order By Key.RecordOrder 
        Select QuestionCategory = Key, Questions = Group 

順序按Key.RecordOrder拋出一個空引用異常,我可以理解爲什麼。有人可以建議如何通過修改這一個查詢來解決這個問題嗎?我對LINQ相當陌生,並且在VB .Net中編寫這個項目的必要性並沒有幫助。 :-)

就這麼你知道,我願意採取另一種解決問題的方法。我已經嘗試了左外連接,但我對這種方法的排序感到困惑。這是我的替代查詢。

Dim AllSurveyQuestions = (From sq In CurrentSurvey.SurveyQuestions Group Join qc In CurrentSurvey.SurveyQuestionCategories 
         On sq.SurveysNEW Equals qc.SurveysNEW Into sqc = Group 
         From qc In sqc.DefaultIfEmpty() 
         Select sq Order By sq.RecordOrder).Distinct() 

感謝您的幫助提前。

回答

1

這裏有一個想法,沒有測試但:

Dim AllQuestions = From sq In CurrentSurvey.SurveyQuestions 
        Order By sq.RecordOrder 
        Group sq By Key = sq.SurveyQuestionCategory Into Group 
        Select QuestionCategory = Key, Questions = Group, 
          CategoryOrder = If(Key Is Nothing, -1, Key.RecordOrder) 
        Order By CategoryOrder 

我以爲RecordOrder是一個整數,通過將-1的情況下,沒有類別,這些問題將首先出現。現在,如果這是一個LinqToSql查詢,也許If條件不起作用。

+0

謝謝,這工作完美! –