2016-07-26 15 views
1

ich eine Umfrage, wo die Antworten von einer Session GUID und einen Zeitstempel der Antwort gruppiert sind:kann nicht von Session-ID mit Linq C# gruppierte neueste Antworten einer Umfrage bekommen

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; } 
} 

Wenn die Antwort-Typ ist Numerisch (von 1 bis 5 Sterne) ist die Zahl gefüllt, wenn die Antwort vom Typ Text ist (wie ein Kommentar), ist der Text gefüllt.

Beispiel Datensätze:

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 

Das Problem ist, dass ich nicht kann Gruppe von Sitzung und von Datecreated bestellt, weil sie beide unterschiedliche Datensätze sind.

Der Code ich, dass haben nicht funktioniert ist:

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);     

Antwort

1

Versuchen Sie dieses:

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

Hallo, Vielen Dank für Ihre Hilfe! – Patrick

1

Dies sollten Sie die Antworten nach Sitzung gruppiert geben.

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(); 

Die Variable answersGroupedBySession wird eine Liste von annonymous Objekte mit 2 Eigenschaften Session und Antworten sein. Für jede Sitzung werden die Antworten in der Eigenschaft Antworten gruppiert (und nach Datum sortiert). Wenn Sie das anonyme Objekt nicht bevorzugen, können Sie dafür ein dto erstellen.

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

und verwenden Sie das im Projektionsteil.

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

Hallo Dank! Ich habe Dryadwoods Antwort, weil es mir genau alle Daten gibt, die ich brauche (LocationName, DateCreated, Comment), aber ich danke Ihnen sehr für Ihre Hilfe. – Patrick