2017-01-05 6 views
1

のグループ&マックス:SQL:私はLINQのには、このSQL文を変換する必要があるすべての列

select id, workerId, max(timestamp) as Datex, clientId from order where clientId = '123' group by workerId; 

これは、テーブルの順序のすべての列を持つテーブルを作成します。しかし、それはclientID = 123の行だけを表示し、それをワーカによってグループ化します。最新のエントリー(最大タイムスタンプ)を表示します

どのようにLinqに転送できますか?私はすべてを試みた。この例のdoesn't作品:

var selectedOrder = from s in order 
        where s.clientID == "123" 
        group s by s.workerId into g 
        select new { id = s.id, workerId = g.Key, Datex = g.Max(s => s.timestamp), s.clientID}; 

UPDATE:原因私はしたいクエリに

id: 1 workerId: 162 Datex: 2014-11-13 clientId: 123 
id: 2 workerId: 162 Datex: 2016-01-07 clientId: 123 
id: 3 workerId: 222 Datex: 2015-12-12 clientId: 123 
id: 4 workerId: 222 Datex: 2013-01-22 clientId: 100 
id: 2 workerId: 162 Datex: 2011-11-07 clientId: 123 

:私はあなたの例を与えるたい

  1. id: 2 workerId: 162 Datex: 2016-01-07 clientId: 123 
        id: 3 workerId: 222 Datex: 2015-12-12 clientId: 123 
    

    - >私の最初のテーブルには2人の異なる労働者しかいません。私はあなたがOrderByを使用してFirst()を使用することができ、すべての労働者

+4

'id'列のようになります。 group byステートメントでは使用されません。あなたはこのsqlクエリを実行できますか? –

+0

はい、動作します。アイデアはすべての作業者の最新のTupelを表示することです。だから、すべてのworkerIdは一度しか表示されません。 –

+0

つまり、私はすべての労働者の最新のTupelショーを表示したい –

答えて

1

のための最新の日付を持つ行を表示したい、クエリが

var selectedOrder = (from s in order 
      where s.clientID == "123" 
      select new 
      { 
       id = s.id, 
       workerId = s.workerId, 
       Datex = s.timestamp, 
       clientID =s.clientID 
      }).OrderBy(d => d.Datex).First(); 

またはGroupBy複数列

var selectedOrder = from s in order 
      where s.clientID == "123" 
      group s by new {s.workerId, s.id, s.clientID} 
      into g 
      select 
      new 
      { 
       id = g.Key.id, 
       workerId = g.Key.workerId, 
       Datex = g.Max(s => s.timestamp), 
       clientID = g.Key.clientID 
      }; 
+0

最初のコードは、すべての労働者の非常に最初のTupelを示しています。しかし、私はすべての労働者の最初のTupelを見せたい –

関連する問題