2013-03-12 16 views
6

Ich habe eine Datenbank mit 4 Feldern, die etwa wie folgt aussieht:unterschiedlichem Spaltenwert mit LINQ

ID  DeviceId  Location  Date 
1   A    ...   2 
2   A    ...   1 
3   B    ...   2 

Für jeden DeviceId ich die Lage aus dem Datensatz will mit dem höchsten Datum. Ich kann den deutlichen DeviceId zu bekommen ist wie folgt aus:

// get all locations 
var locations = Session.Query<Location>().ToList(); 

//Get the latest used unique deviceId's 
var distinctDeviceIdsByDate = (
     from loc in locations 
     orderby loc.DeviceId, loc.Date descending 
     select loc.DeviceId).Distinct().ToList(); 

Ich würde dann die gewünschten Zeilen zu erhalten verwenden beitreten, aber das wird nicht gut tun, da ich nichts anderes als die DeviceId bekommen kann 's und kann daher nicht identifizieren, welche Zeilen ausgewählt werden sollen. und wenn ich versuche, folgendes auszuwählen:

select loc 

Ich kann nur die Zeilen mit eindeutigen Kombinationen aller Spalten erhalten. Ich bin mir sicher, dass es eine einfache Lösung gibt, aber ich fürchte, ich kann es jetzt nicht herausfinden.

+2

So werden für jedes Gerät ID Sie den Speicherort aus dem Datensatz mit dem höchsten Datum wollen? –

+0

Ja, genau! Ich werde die Frage bearbeiten, um zu sagen, was du gesagt hast. – dansv130

+0

Sie sollten die Frage nicht bearbeiten, um die Antwort aufzunehmen. Sie sollten denjenigen markieren, den Sie für richtig halten oder Ihnen am meisten helfen. – rae1

Antwort

7

Ich denke, Sie müssen eine Kombination von GroupBy und Take verwenden. Versuchen Sie dies,

var distinctDeviceIdsByDate = 
    locations.OrderByDescending(location => location.DeviceId) 
      .ThenByDescending(location => location.Date) 
      .GroupBy(location => location.DeviceId) 
      .SelectMany(location => location.Take(1)); 
+0

Sieht so aus, als ob das so funktioniert, wie ich es möchte! Ich werde die Frage mit Ihrer akkreditierten Lösung aktualisieren! – dansv130

0

Sie können eine Gruppierung verwenden, um dies zu lösen.

var locations = new [] { 
    new { DeviceId = "A", Date = 2, Location = ".." }, 
    new { DeviceId = "A", Date = 1, Location = ".." }, 
    new { DeviceId = "B", Date = 2, Location = "...." }, 
}; 

var lastUsedLocations = 
    from l in locations 
    group l by l.DeviceId into g 
    let lastUsed = g.OrderBy(x => x.Date).Last() 
    select lastUsed; 

// lastUsedLocations contains 
// DeviceId  Date  Location 
// A    2   .. 
// B    2   .... 
+0

Das sieht auch nach einer möglichen Lösung aus, aber da die Antwort von DotNetWala funktioniert, werde ich es jetzt verwenden und andere Lösungen untersuchen, sollte ich auf Probleme stoßen. – dansv130

+0

Sie sind im Wesentlichen gleich. Das Schlüsselkonzept ist die Gruppierung. –

1

Unter der Annahme, dass Date pro DeviceId einzigartig könnten Sie versuchen,

//Get the latest used unique deviceId's 
var distinctDeviceIdsByDate = (
     from loc in Session.Query<Location>() 
     group loc by loc.DeviceId 
     into g 
     select new 
     { 
      DeviceID = g.Key, 
      Location = g.OrderByDescending(l => l.Date).First().Location; 
     }; 
+0

Das sieht nach einer möglichen Lösung aus, aber da die Antwort von DotNetWala funktioniert, werde ich es für jetzt verwenden und andere Lösungen untersuchen, sollte ich auf Probleme stoßen. – dansv130

+0

Dies funktioniert nicht mit NHibernate und löst die folgende SqlException aus: Die Spalte 'Location.Date' ist in der Auswahlliste ungültig, weil sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. –

Verwandte Themen