2013-06-20 3 views
1

У меня есть, казалось бы, простая задача, в которой у меня гораздо больше проблем, чем я хочу признать. У меня есть иерархическая таблица, которую мне нужно запросить и отобразить результаты, сгруппированные родителем с дочерними элементами.LINQ Grouping by 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

отредактирован для исправления нулевого значения –

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

Я принимаю быстрый ответ на вопрос, но у вас вполне будущее. Спасибо за оперативную помощь! –