2011-07-04 9 views
4

SQLで解決する方法を知っていますが、Linqでエンティティを解決する方法はわかりません。LINQ to Entities順序付きグループからトップレコードを見つけよう

私のデータは次のようになります。

ID GROUP TIMESTAMP 
-- ----- --------- 
1  A  2011-06-20 
2  A  2011-06-21 
3  B  2011-06-21 
4  B  2011-06-22 
5  B  2011-06-23 
6  C  2011-06-30 

私は唯一の各グループからの最新のレコードを取得していますように、すべてのエンティティオブジェクト(だけでなく、ID)を取得したいです。 (すなわち、IDS 2、5のレコード、6。)私はこのようなものだろうSQLで

SELECT * FROM my_table a 
WHERE a.timestamp = 
    (SELECT MAX(timestamp) FROM my_table b 
    WHERE a.group = b.group) 

は(この質問のために、あなたはそのタイムスタンプは、各グループ内で一意であると仮定することができます)。

Linq to Entitiesを使用してWCF Data Serviceに対してこのクエリを実行したいと思いますが、このような外部クエリを参照するネストされたクエリを持つことはできません。誰も助けることができますか?

答えて

2

ない手書きのバージョンと同様に、クリーンで効率的なしかし、ここで私は、このSQLに

SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Group] AS [Group], 
[Project1].[Timestamp] AS [Timestamp] 
FROM (SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Group] AS [Group], 
     [Extent1].[Timestamp] AS [Timestamp], 
     [SSQTAB1].[A1] AS [C1] 
     FROM [MyEntities] AS [Extent1] 
     OUTER APPLY 
     (SELECT 
       MAX([Extent2].[Timestamp]) AS [A1] 
       FROM [MyEntities] AS [Extent2] 
       WHERE [Extent2].[Group] = [Extent1].[Group]) AS [SSQTAB1] 
) AS [Project1] 
WHERE [Project1].[Timestamp] = [Project1].[C1] 
を翻訳した

var q = from a in db.MyEntities 
      where a.Timestamp == (from b in db.MyEntities 
            where b.Group == a.Group 
            select b.Timestamp).Max() 
      select a; 

思い付いたものです

1

こんにちはlinqerを使用すると、SQL文がlinqクエリに変換されます。おそらく

Linqer

よろしく

+0

非常にクールなツール!私はそれを試して、それまでのところ、それは私が望むものを私に与えるように見える。生成するクエリは次のようになります。 – codemonkey

+0

ええと、あなたのためにlinqの仕事が生成されました@codemonkey? – BizApps

+0

クエリを貼り付けるのに問題はありましたが、うまくいきました。それは、@MerickOWAの下の回答とほぼ同じです。 – codemonkey

0

これが動作するはずです:

var query = db.my_table 
    .GroupBy(p=>p.group) 
    .Select(p=>p.OrderByDescending(q=>q.timestamp).First()); 
0

ここに行きます。簡単なやり方。

 var result = (from x in my_table 
         group x by x.Group into g 
         select new 
         { 
          g.Key, 
          timestamp = g.Max(x => x.TimeStamp), 
          g //This will return everything in g 
         }); 
+0

これは、 "グループ"と "タイムスタンプ"を返しますが、関連付けられている可能性のあるIdや他の列のようなエンティティ全体を返しません。 – MerickOWA

+0

select句にgを追加するだけです。 { g.Key、 timestamp = g.Max(x => x.TimeStamp)、g } –