Linq group由一个实体组成,然后由分组(可空)实体排序

时间:2011-07-27 11:13:03

标签: asp.net vb.net linq entity-framework-4

我正在尝试从现有的数据库设计构建一个调查引擎,就像这样。

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

Order By 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 个答案:

答案 0 :(得分: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条件不起作用。