【问题标题】:LINQ Grouping by ParentId按 ParentId 进行 LINQ 分组
【发布时间】:2013-06-21 01:49:57
【问题描述】:

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

我当前的 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 语法获得所需的结果。

【问题讨论】:

  • 订单是我看到的唯一区别吗?
  • OrderBy(q => q.ParentQueryId).ThenBy(q => q.QuestionId) 能得到你想要的吗?
  • 感谢 Servy 添加图片。我还没有足够的代表。 :)
  • @matt-dot-net 是的,订单确实是唯一重要的事情。
  • Linqpad 不是很棒吗?

标签: c# linq


【解决方案1】:

根据 Servys 的评论进行更新。

第一行是确保将所有相关问题归为一组。 第二行是确保父母问题是第一位的。 第三行是正确订购

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

【讨论】:

  • 从外观上看,这可能适用于 OP 的特定数据,但不能解决根本问题,因为它依赖于可能不成立的假设。请注意,他实际上是在尝试构建一棵树,其中每个孩子都跟随其父母或年长的兄弟姐妹。
  • @Servy - 你是对的。虽然这确实可以快速修复,但一旦树结构增长到多个级别,它可能会中断。我现在可以快速修复。感谢所有帮助!
  • 更新后的答案有助于进一步...谢谢..我会尽快接受答案。
  • @MikeRamsey - 我很高兴能提供帮助
【解决方案2】:

因此,您在这里真正尝试创建的是一个基于树的结构,在该结构中,在顶层,您有所有没有父级的问题,然后作为“子”节点,所有问题都具有父母。

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);

【讨论】:

  • 我接受快速修复的答案,但你的答案是未来的证明。感谢您的及时帮助!
【解决方案3】:
.OrderBy(x => (x.ParentQuestionId==null?x.QuestionId:x.ParentQuestionId.Value));

【讨论】:

  • 这似乎没有产生预期的结果。注意问题 265。
  • 是的,我按照您和牛排的建议尝试过,但没有帮助。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多