2016-07-26 30 views
1

我有哪裏的答案是由會話GUID分組調查,在回答的時間戳分組調查的最新的答案:無法獲得通過會話ID使用LINQ C#

public class Answer 
{ 
    [Key] 
    public int Id { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Session { get; set; } 
    public int Numeric { get; set; } 
    public string Text { get; set; } 
} 

如果答案是類型數字(從1到5星)填充數字,如果答案是類型文本(如評論),則填充文本。記錄

例子:

48 2016-07-15 11:20:14.823 12f68234-fee0-4a3a-88ef-f3977824ed51 5 NULL 
    49 2016-07-15 11:20:19.550 12f68234-fee0-4a3a-88ef-f3977824ed51 2 NULL 
    50 2016-07-15 11:20:19.553 12f68234-fee0-4a3a-88ef-f3977824ed51 4 NULL 
    51 2016-07-15 11:20:19.557 12f68234-fee0-4a3a-88ef-f3977824ed51 3 NULL 
    52 2016-07-15 11:20:19.560 12f68234-fee0-4a3a-88ef-f3977824ed51 0 gostei bastante! 
    53 2016-07-15 11:59:59.000 a143125e-0463-13f9-fc83-48d660c96156 4 NULL 
    54 2016-07-15 12:00:26.277 a143125e-0463-13f9-fc83-48d660c96156 4 NULL 
    55 2016-07-15 12:00:26.277 a143125e-0463-13f9-fc83-48d660c96156 3 NULL 
    56 2016-07-15 12:00:26.277 a143125e-0463-13f9-fc83-48d660c96156 4 NULL 
    57 2016-07-15 12:00:26.297 a143125e-0463-13f9-fc83-48d660c96156 0 Acho que há algumas coisas para melhorar 
    58 2016-07-15 17:56:00.503 610821d4-5c48-4222-8c49-c19f0dd9182c 5 NULL 
    59 2016-07-15 17:56:16.617 610821d4-5c48-4222-8c49-c19f0dd9182c 5 NULL 
    60 2016-07-15 17:56:16.620 610821d4-5c48-4222-8c49-c19f0dd9182c 5 NULL 
    61 2016-07-15 17:56:16.617 610821d4-5c48-4222-8c49-c19f0dd9182c 4 NULL 
    62 2016-07-15 17:56:16.637 610821d4-5c48-4222-8c49-c19f0dd9182c 0 Gostei bastante de todo o serviço 

的問題是,我可以不按會話組和dateCreated會下令,因爲他們都是不重複的記錄。

我有一個代碼不工作是:

var sessions = _dbContext.Answers 
    .Where(p => p.Location.Company.Id == id) 
    .Where(p => p.Question.Type == QuestionType.Text) 
    .Where(p => p.Text != "") 
    .OrderByDescending(p => p.DateCreated) 
    .Select(p => p.Session) 
    .Distinct() 
    .Take(count); 

    var dto = new List<GetLastCommentsByCountByCompanyIdDTO>(); 

    foreach (var session in sessions) 
    { 
     dto.Add(new GetLastCommentsByCountByCompanyIdDTO 
     { 
      LocationName = _dbContext.Answers.Where(s => s.Session == session).Select(s => s.Location.Name).FirstOrDefault(), 
      DateCreated = _dbContext.Answers.Where(s => s.Session == session).Select(s => s.DateCreated).FirstOrDefault(), 
      Comment = _dbContext.Answers.Where(s => s.Session == session && s.Question.Type == QuestionType.Text).Select(s => s.Text).FirstOrDefault() 
     }); 
    } 

    return dto.OrderByDescending(p => p.DateCreated);     

回答

1

試試這個:

var baseQuery = _dbContext.Answers.AsNoTracking() 
       .Where(p => p.Location.Company.Id == id 
          && p.Question.Type == QuestionType.Text 
          && p.Text != null 
          && p.Text != "") 
       .GroupBy(g => new { Session = g.Session, Location = g.Location.Name }) 
       .Select(x => 
          new 
          { 
           Session = x.Key.Session, 
           LocationName = x.Key.Location, 
           LastAnswer = x.OrderByDescending(f => f.DateCreated).FirstOrDefault() 
          }) 
       .Select(x => new GetLastCommentsByCountByCompanyIdDTO 
       { 
        LocationName = x.LocationName, 
        DateCreated = x.LastAnswer.DateCreated, 
        Comment = x.LastAnswer.Text 
       }) 
       .OrderByDescending(x => x.DateCreated) 
       .Take(count); 

      var res = baseQuery.ToList(); 
+1

嗨,謝謝你的幫助! – Patrick

1

這應該給你按會話分組的答案。

var answersGroupedBySession = _dbContext.Answers 
             .Where(p => p.Location.Company.Id == id 
               && p.Question.Type ==QuestionType.Text 
               && p=>!String.IsNullOrEmpty(p.Text)) 
             .GroupBy(g => g.Session, items => items, 
                 (key, value) => 
          new { 
            Session = key, 
            Answers = value.OrderByDescending(f => f.DateCreated) 
           }).ToList(); 

可變answersGroupedBySession將annonymous對象與2個屬性會話和解答的列表。對於每個會話,答案將在Answers屬性下進行分組(並按日期排序)。如果你不喜歡這個匿名對象,你可以爲它創建一個dto。

public class GroupedAnswers 
{ 
    public string Session {set;get;} 
    public IEnumerable<Answer> Answers {set;get;} 
} 

並將其用於投影部分。

.GroupBy(g => g.Session, items => items, (key, value) => new GroupedAnswers 
{ 
    Session = key, 
    Answers = value.OrderByDescending(f => f.DateCreated) 
}).ToList(); 
+0

感謝你好!我檢查了Dryadwoods的答案,因爲它給了我所需的所有數據(LocationName,DateCreated,Comment),但非常感謝您的幫助。 – Patrick