我有一个看似简单的任务,我遇到的麻烦比我承认的要多得多。我有一个分层表,我需要查询并显示由父项和相关子项分组的结果。
我当前的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);
这会产生一个结果集:
我想要制作的是:
我的问题很简单,如何使用Lambda语法获得所需的结果。
答案 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));