2011-07-04 34 views
4

我有一個問題,我知道如何在SQL中解決問題,但不能與Linq to Entities解決。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到實體的WCF數據服務執行此查詢,但我似乎無法像這樣引用外部查詢的嵌套查詢。誰能幫忙?

回答

2

可能不一樣乾淨,高效爲手寫版本,但這裏是我想出了

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; 

換算成這個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] 
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

這只是返回「Group」和「Timestamp」,而不是像Id或其他可能關聯的列那樣的整個實體。 – MerickOWA

+0

您只需要在select子句中添加g,例如選擇新的 g.Key, timestamp = g.Max(x => x.TimeStamp),g } –