2016-09-20 3 views
1

nicht in der Lage gezielt zu finden, die Antworten auf meine Frage ..Erste mehrere Distinct gruppierten Werte in Linq

Ich brauche ein Ergebnis, das Display zu bekommen: ONCE Projektnamen, mit allen Benutzern, die timeEntries gemacht haben an diesem Projekt in einem bestimmten Zeitraum.

Und ich brauche zu bekommen die timeEntries (hoursEntered) als gut, so kann ich berechnen, wie viele Stunden haben an diesem Projekt insgesamt ausgegeben worden ..

Ich bin neu in diesem, so dass ich hoffe, dass ich zur Verfügung gestellt haben genügend Informationen ..

mein Code:

var dateStart = new DateTime (2016,09,01); 
var dateEnd = new DateTime (2016,09,19); 

var query = (from timeEntry in TimeEntries 
     join task in Tasks on timeEntry.TaskID equals task.TaskID 
     join project in Projects on task.ProjectID equals project.ProjectID 
     where timeEntry.DateEntity >= dateStart && timeEntry.DateEntity <= dateEnd 
     select new { 
     User = timeEntry.User.FirstName + " "+timeEntry.User.LastName, 
     Project = timeEntry.Task.Project.ProjectName, 
     ProjectId = timeEntry.Task.ProjectID, 
     HoursEntered = timeEntry.HoursEntered 
     }).GroupBy (q => q.Project).Distinct(); 

ich habe 4 Tabellen:

  • Projekte (ProjectID, Projektname)
  • Aufgaben (TaskId, ProjectID)
  • TimeEntries (HoursEntered, DateEntity, TaskId)
  • Benutzer (Vorname, Nachname)
+0

Fügen Sie Ihre 'TimeEntries' Klasse zu Ihrem Beitrag, bitte. – rbr94

+0

meine Klasse? TimeEntries ist meine Tabelle von DB. – andrelange91

+1

Er braucht die Eigenschaft/Spalten, wie 'StundenEntered' usw. –

Antwort

2
var query = 
    from timeEntry in TimeEntries 
    where timeEntry.DateEntity >= dateStart && timeEntry.DateEntity <= dateEnd 
    select new { 
    User = timeEntry.User.FirstName + " "+timeEntry.User.LastName, 
    Project = timeEntry.Task.Project.ProjectName, 
    ProjectId = timeEntry.Task.ProjectID, 
    HoursEntered = timeEntry.HoursEntered 
    } 

var localRows = query.ToList(); 

var groups = localRows.GroupBy(x => x.Project); 

var projects = groups.Select(g => new { 
    Project = g.Key, 
    Hours = g.Sum(x => x.HoursEntered), 
    Users = g.Select(x => x.User).Distinct().ToList() 
}).ToList(); 
+0

dieser ist sehr nah, aber ich bekomme immer noch mehrere Datensätze mit dem gleichen Benutzernamen .. Ich brauche es nur für jeden Benutzer anzuzeigen, der Stunden in das Projekt eingegeben hat. – andrelange91

+0

Fair genug, behoben. –

+0

Scheint zu arbeiten, thx für die Hilfe ^^ – andrelange91

1

Vielleicht mit:

var query = (from timeEntry in TimeEntries 
     join task in Tasks on timeEntry.TaskID equals task.TaskID 
     join project in Projects on task.ProjectID equals project.ProjectID 
     where timeEntry.DateEntity >= dateStart && timeEntry.DateEntity <= dateEnd 
     group timeEntry by new { proyect.ProjectID, proyect.ProjectName } into g 
     select new { 
     TimeEntries = g.ToArray(), 
     Project = g.Key.ProjectName , 
     ProjectId = g.Key.ProjectID, 
     HoursEntered = g.Sum(e => e.HoursEntered) 
     }); 

Ich brauche mehr Informationen, um es mehr einzustellen, aber ich denke, das sollte Ihnen helfen. Ich habe es auf der Suche gemacht, also musst du die Namen überprüfen.

Group by in LINQ

+0

Ziemlich gut, habe eine +1. Seien Sie vorsichtig bei der Verwendung in einer Datenbank. LinqToSql wird wahrscheinlich zusätzliche Abfragen ausführen, um den TimeEntries = g.ToArray-Teil abzurufen. –

+0

dieser bekommt viel zu viele Daten, die ich nicht brauche. und gibt mir nicht die Benutzernamen – andrelange91

+0

Nun, da Sie der einzige sind, der die Datenbank kennt und was Sie brauchen, passen Sie die Abfrage einfach an. +1 auf die LinqToSql. Aber YAGNI bis auf eine große Datenbank. –