由ParentId进行LINQ分组

时间:2013-06-20 17:28:31

标签: c# linq

我有一个看似简单的任务,我遇到的麻烦比我承认的要多得多。我有一个分层表,我需要查询并显示由父项和相关子项分组的结果。

我当前的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

我的问题很简单,如何使用Lambda语法获得所需的结果。

3 个答案:

答案 0 :(得分:2)

根据Servys的评论更新。

第一行是确保将所有相关问题组合在一起。 第二行是确保父问题是第一位的。 第三行是正确订购

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

答案 1 :(得分: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);

答案 2 :(得分:-1)

.OrderBy(x => (x.ParentQuestionId==null?x.QuestionId:x.ParentQuestionId.Value));