2016-04-03 16 views
2

Ich habe eine Liste von Elementen im Zusammenhang mit Benutzern.Bestellte Gruppe letzten Artikel

Jeder Artikel hat ein Datum.
Ich möchte das letzte Element erhalten (nach Datum) jedes Nutzers

Zum Beispiel, wenn Daten:

Id1, User1, 1.1.16 
Id2, User2, 2.1.16 
Id1, User1, 4.1.16 
Id4, User2, 3.1.16 
Id3, User1, 2.1.16 
Id4, User2, 5.1.16 

Es sollte das letzte Element zurückkehrt (nach Datum) von jedem des Benutzers :

Id1 User1 4.1.16 
Id4 User2 5.1.16 

Meine Frage ist:

from sf in db.Items 
where ... 
group i by i.UserId into g 
select g.OrderByDescending(s => s.StartDate).FirstOrDefault(); 


Aus irgendeinem Grund wird es immer das erste Element des Benutzers.
Wenn ich alle Gruppen und ihre Artikel drucke, sieht es OK aus und das erste Element
ist das letzte in jeder Gruppe, aber die Abfrage gibt es nicht zurück.

Ich habe versucht, g.OrderBy zu ändern ..didn't zu helfen
auch g.ToList() hinzuzufügen versucht ...
Wie kann ich die neuesten Artikel von jedem Nutzer bekommen?

Es funktioniert, wenn im die Abfrage
... Gruppe i von i.UserId in g
wählen g.OrderByDescending (s => s.StartDate)

und als zu ändern, wenn Ich Schleife auf Gruppen Ich nehme erste Artikel
foreach (var g in Abfrage)
{
var last = g.First();

Antwort

1

Sie brauchen etwas wie folgt aus:

var result = from sf in db.Items 
      where ... 
      group i by i.UserId into gr 
      select new 
      { 
       UserId = gr.Key 
       LatestItem = gr.OrderByDescending(s => s.StartDate) 
           .FirstOrDefault() 
      }; 

die Gruppierung gemacht Nachdem dann projizieren Sie jede Gruppe in einem anonymen Typ Objekt mit zwei Eigenschaften. Die erste Eigenschaft ist der Schlüssel der Gruppe UserId. Während der zweite ist die LatestItem für diesen Benutzer.

+0

Leider bekomme ich das gleiche wieder. Es funktioniert nur, wenn ich die gesamte Gruppe auswähle und wenn ich Gruppen wiederhole, wähle ich zuerst. foreach (var gr in resultQuesry) var last = gr.First(); –

Verwandte Themen