【问题标题】:Group by with include (inner join)分组方式包括(内部连接)
【发布时间】:2019-12-08 08:39:11
【问题描述】:

我正在查询由下图中的其他两个表生成的表。 在一个类别中,我可以有几个问题。

使用此查询没有得到我预期的结果:

 var result = await _repository.GetQuestionCategory()
                 .Include(x => x.Category)
                 .Include(y => y.Question)
                 .Select(x => new QuestionCategoryViewModel
                 {
                     Id = x.Id,
                     CategoryId = x.Category.Id,
                     CategoryName = x.Category.Name,
                     IsRequired = x.IsRequired,
                     QuestionId = x.Question.Id,
                     QuestionName = x.Question.Name,
                     Weigth = x.Weigth
                 }).GroupBy(x => x.CategoryId).ToListAsync().ConfigureAwait(false);

我怎样才能发送类似这样的结构

{ categoryId, categoryName, IsRiquered, Weigth, questions: [ questionId: questionName: y]}

Mmodel 类别和问题

    public class QuestionCategory
    {
		public Guid Id { get; set; }
		public Question Question { get; set;}
		public Category Category { get; set;}
		public int QuestionId { get; set; }
		public int CategoryId { get; set; }
        public bool IsRequired { get; set; }
		public int Weigth { get; set; }
    }

【问题讨论】:

  • 您需要使用GroupBy。你能显示QuestionCategory的类型吗?具体来说,.Question.Category 是什么?
  • 我正在使用,如上面的代码。因为这是带来矩阵组并且没有条件这个结构:{categoryId, categoryName, IsRiquered, Weigth, questions: [{questionId: questionName: y}]
  • 我用模特编辑了这篇文章
  • 错误的模型 - 需要 QuestionCategory 或属性 y.Questionx.Category 的定义,而不是它们的类。
  • 我更新我的帖子

标签: c# asp.net database linq iqueryable


【解决方案1】:

您应该使用带有大部分参数的 GroupBy 语句。请注意,结果属性的不一致命名取自问题 1:1。您可能想要创建一些显式的 DTO 类型,而不是将结果创建为匿名类型。

IQueryable<QuestionCategory> questionCategories = new EnumerableQuery<QuestionCategory>(Enumerable.Empty<QuestionCategory>());

var result = questionCategories.GroupBy(
    // key selector
    qc => new
    {
        categoryId = qc.CategoryId,
        categoryName = qc.Category.Name,
        IsRiquered = qc.IsRequired,
        Weigth = qc.Weigth
    },
    // element selector
    qc => qc.Question,
    // result selector
    (k, v) => new
    {
        k.categoryId,
        k.categoryName,
        k.IsRiquered,
        k.Weigth,
        questions = v.Select(q => new {questionId = q.Id, questionName = q.Name}).ToList()
    });

【讨论】:

  • 是否可以对重复的类别进行分组?
  • @EliemersonFonseca 你必须决定你想要的结果格式。我的回答针对您要求的结构。如果您需要不同的结构,则必须指定它。
  • 传递的格式正确。但我需要类别重复在同一个正文中,而不是像这样重复
  • @EliemersonFonseca 不应有任何具有相同类别和相同重量/ IsRequired 值的重复项。您的格式不适合独立于 IsRequired 和 Weight 值对类别进行分组。
猜你喜欢
  • 2014-08-25
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2015-09-04
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多