Linq группировать по сущности, а затем упорядочивать по группируемому - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь создать механизм опроса на основе существующего дизайна базы данных, подобного этому.

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 Ответ

1 голос
/ 27 июля 2011

Вот идея, но не проверенная:

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 не будет работать.

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