2013-03-12 9 views
6

を使用して個別の列の値を持つすべての行を選択します。私は最高の日付を持つレコードから場所を希望する各DeviceIdに対して私は次のようになります4つのフィールドを持つデータベース持ってLINQ

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

を。 S:「Iは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(); 

このようなS」の私は、明確なDeviceIdを得ることができます選択する行を特定することはできません。次の項目を選択しようとすると:

すべての列の固有の組み合わせで行を取得できます。私は単純な解決策があると確信していますが、私は今、それを理解することはできません。

+2

を試みることができますか? –

+0

はい、まさに!あなたが言ったことを言うために質問を編集します。 – dansv130

+0

回答を含めるために質問を編集しないでください。あなたが正しいと思うものに印を付けるか、あなたに一番助けてください。 – rae1

答えて

7

GroupByTakeの組み合わせを使用する必要があると思います。試してみてください。

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

これは私の望むやり方のように見えます!私はあなたの認定を受けたあなたのソリューションで質問を更新します! – dansv130

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   .... 
+0

これも可能な解決策のようですが、DotNetWalaからの回答がうまく機能しているので、私は現在これを使用して、他のソリューションを調査します。 – dansv130

+0

これらは本質的に同じです。重要な概念はグループ化です。 –

1

DateDeviceIdごとに一意であると仮定すると、あなたは、各デバイスのIDのためにあなたが最高の日付を持つレコードから場所をしたいので、

//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

これは可能な解決策のようにも見えますが、DotNetWalaからの回答がうまく機能しているので、私はこれを今使っていきます。 – dansv130

+0

これはNHibernateでは動作せず、以下のSqlExceptionがスローされます:Column 'Location.Date'は集計関数またはGROUP BY句に含まれていないため、選択リストでは無効です。 –

関連する問題