0

我需要一种方法来仅获取具有以下特定问题 ID 的最新答案。

以下对象类:

Teams
Store
Employee
Answer
Question

设置:

  • 每个团队都有多家商店。
  • 每个商店都有多个团队。
  • 每家商店也有一个收藏员工。
  • 每个员工都有一家商店。
  • 一些员工有答案,而且这些人对同一个问题都有多个回答,但我只关心对给定问题的最新回答。
  • 所有答案都有对应的问题。

我需要运行一个包含数据库中最新答案响应计数的报告。我只能考虑每个员工的最新回复,因为员工可以每 10 分钟更改一次回复。我不在乎是否有人回答过“1”,对我来说重要的是他们最近的回答是否是“1”。

如果是我会数他们,如果不是我不会。此外,还有多个问题。所以我不能只接受最近的回答,因为我也会丢失其他问题。

现在我有以下内容,这实际上很重要,如果有任何员工曾经有过这样的回答。

 var answers = _employeeService.GetAll()
                .Where(p => p.Store.Teams.Any(t => t.Team.Id.Equals(teamId)))
                .SelectMany(t => t.Answers)
                .OrderByDescending(t => t.Answer.Created)
                .GroupBy(x => new
                {
                    AnswerId = x.Answer.Id,
                    AnswerNumber = x.Answer.Number,
                    AnswerText = x.Answer.Text,
                    QuestionId = x.Answer.Question.Id,
                    QuestionText = x.Answer.Question.Title
                }).Select(x => new AnswerReport()

我将如何过滤掉它,这样我就不会重复计算人数?如果有人回答 1、2、3、4、5,他们的答案将被计算五次。

我脑子里想的是这样的:

        .SelectMany(t => t.Answers)
        .OrderByDescending(t => t.Answer.Created)
        .SelectMostRecent(t => t.Question.Distinct()))  // clearly made up
        .GroupBy(x => new
4

2 回答 2

0

确保您将员工 ID 作为答案实体中的属性。然后,您可以通过按问题 ID 和员工 ID 进行分组来获取每个员工和问题的最新答案,并根据每个预计组的最新创建日期获取最新记录。

于 2013-08-04T07:01:15.273 回答
0

这是我的 hacky 解决方案。

 //Get all the possible questions in the database, with the count sent to zero
   var allPossible = _assessmentService.GetAll()
     .SelectMany(p => p.Answers).Select(x => new AnswerReport()
          {
              AnswerCount = 0,
              AnswerId = x.Id,
              AnswerNumber = x.Number,
              AnswerText = x.Text,
              QuestionId = x.Question.Id,
              QuestionText = x.Question.Title
          }).ToList();

foreach (var answer in allPossible)
  {     
  /*  Warning: might be too complicated for Linq2Sql */
   answer.AnswerCount = _employeeService.GetAll()
   .Where(e => e.Store.Teams.Any(p => p.Team.Id.Equals(teamId)))
   .Where(e => e.Answers.Any(p => p.Answer.Id.Equals(answer.AnswerId)))
    .Select(a => new
           {
          AnswerInfo = a.Answers
                       .Select(p => new{
                             AnswerId = answer.AnswerId,
                             QuestionId = answer.QuestionId
                             })
                            .FirstOrDefault(ans => 
                             ans.QuestionId.Equals(answer.QuestionId))
            }).ToList()
              //This .ToList() is yucky, but it's a problem with nhibernate
             .Count(a => a.AnswerInfo.AnswerId.Equals(answer.AnswerId));
      }
于 2013-08-04T18:31:17.727 回答