【问题标题】:C# linq group by multiple timesC# linq group by 多次
【发布时间】:2016-02-21 10:32:30
【问题描述】:

我有一个对象测验,看起来像:

public class Quiz
{     
    public int Id { get; set; }          
    public ICollection<MathQuiz> MathQuizzes { get; set; }     
}

MathQuizze 对象看起来像:

public class MathQuiz
{

    public int Id { get; set; }

    public int QuizId{ get; set; }
    public Quiz Quiz{ get; set; }

    public int AnswerId { get; set; }
    public Answer Answer { get; set; }

    public int TagId{ get; set; }
    public Tag Tag { get; set; }

    public bool IsCorrect { get; set; }

}

并且有一个看起来像这样的对象(UserQuizzes):

public class UserQuizes
    {
        public int Id { get; set; }


        public int UserId { get; set; }
        public User User { get; set; }


        public int QuizId { get; set; }
        public Quiz Quiz { get; set; }

}

UserQuizzes 只是表达用户和测验之间多对多关系的类。 这是一个示例数据:

     List<Quiz> quizzes = new List<Quiz>();
        quizzes.Add(new Quiz{ Id = 1, MathQuizzes = new List<MathQuiz>{ 
                  new MathQuiz { AnswerId = 58, TagId = 1, IsCorrect = false },  
                  new MathQuiz { AnswerId = 26, TagId = 2, IsCorrect = true }, 
                  new MathQuiz { AnswerId = 57, TagId = 3, IsCorrect = true },

                  new Quiz{ Id = 2, MathQuizzes = new List<MathQuiz>{ 
                  new MathQuiz { AnswerId = 59, TagId = 1, IsCorrect = false },  
                  new MathQuiz { AnswerId = 87, TagId = 2, IsCorrect = true }, 
                  new MathQuiz { AnswerId = 25, TagId = 3, IsCorrect = true }, });

    List<UserQuizzes> userQuizzes = new List<UserQuizzes>();
        userQuizzes.Add(new Quiz{ QuizId = 1, UserId = 1},
        userQuizzes.Add(new Quiz{ QuizId = 2, UserId = 1});

请不要花太多时间批评,我只是想使用每个人都非常熟悉的东西。

我想要实现的是由 MathQuiz TagId 的用户测验分组并获取如下数据:

TagId : 1, IsCorrect: true(0), false(2);
TagId : 2, IsCorrect: true(2), false(0);
TagId : 3, IsCorrect: true(2), false(0);

【问题讨论】:

  • 输入错误,我已经更新问题了

标签: c# linq group-by


【解决方案1】:

您发布的代码有错别字,但基本思路如下:

var query =
    from q in quizzes
    from mq in q.MathQuizzes
    join uq in userQuizzes on q.Id equals uq.QuizId
    group mq by mq.TagId into g
    select new
    {
        TagId = g.Key,
        Correct = g.Sum(e => e.IsCorrect ? 1 : 0),
        Incorrect = g.Sum(e => e.IsCorrect ? 0 : 1)
    };

基本上你需要通过加入数据集来获得有效的源集,并进行常规的分组/计算聚合。

【讨论】:

  • 它只在一个简单的查询中工作,没有 foreach 循环。谢谢你的好解决方案!
  • 你还需要加入userQuizzes吗?你不需要它的任何信息。
  • 是的,我不需要,我正在使用包含急切加载,它做同样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
相关资源
最近更新 更多