2013-08-04 59 views
0

我需要一種方法來獲取最新的答案,其中具有特定的問題ID給出以下內容。根據三個字段選擇最近的Lambda

以下對象類:

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 
+0

爲了清晰起見做了一些修改。 –

+1

你的Answer應該有一個'Answer Time'字段,這樣我們就可以命令'Answers'獲得最近的答案(是字段'Created'?)? –

+1

@KingKing:可能是Answer.Created? –

回答

0

請確保您有員工ID作爲答案實體屬性。然後,您可以通過對問題ID和員工ID進行分組,獲得每個員工的最新答案,並根據每個計劃組的最新創建日期獲取最新記錄。

0

這是我的哈克解決方案。

//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)); 
     } 
相關問題