6

次のような 4 つのフィールドを持つデータベースがあります。

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

それぞれについてDeviceId、日付が最も高いレコードの場所が必要です。DeviceId次のような個別のものを取得できます。

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

次に、 join を使用して必要な行を取得しますが、 以外のものを取得できずDeviceId、選択する行を特定できないため、これは役に立ちません。そして、次のものを選択しようとすると:

select loc

すべての列の一意の組み合わせを持つ行のみを取得できます。簡単な解決策があると確信していますが、残念ながら今はわかりません。

4

3 に答える 3

7

GroupByと を組み合わせて使用​​する必要があると思いますTake。これを試して、

var distinctDeviceIdsByDate = 
    locations.OrderByDescending(location => location.DeviceId)
             .ThenByDescending(location => location.Date)
             .GroupBy(location => location.DeviceId)
             .SelectMany(location => location.Take(1));
于 2013-03-12T14:59:29.467 に答える
1

Dateそれが一意であると仮定すると、DeviceId試すことができます

//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;
      };
于 2013-03-12T15:01:55.320 に答える
0

これを解決するには、グループ化を使用できます。

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           ....
于 2013-03-12T15:01:47.780 に答える