2011-07-19 119 views
1

我正在尋找一種方法讓實體框架在數據庫字段中爲每一分鐘返回一條記錄,例如,對於下表:每分鐘選擇一條記錄

Message | Timestamp 
--------+-------------------- 
a  | 2011-01-02 12:31:10 
b  | 2011-01-02 12:31:15 
c  | 2011-01-02 12:31:59 
d  | 2011-01-02 12:32:01 
e  | 2011-01-02 12:32:30 
f  | 2011-01-02 12:33:10 

我想返回

c,e,f (c and e are selected because they are the latest entries) 

查詢使用單個查詢可能是這樣嗎?數據庫非常大,所以我不想檢索所有記錄並在循環中選擇它們。

+0

按年份,月份,日期,小時,分鐘分組。按時間戳排序值。選擇每個組中的第一個條目。 –

回答

1

我使用Linq作爲內存中的集合而不是EF,但您應該可以輕鬆地進行調整。

private static void LinqExample() 
    { 
     var a = new object[] 
        { 
         new object[] {"a", DateTime.Parse(" 2011-01-02 12:31:10")}, 
         new object[] {"b", DateTime.Parse(" 2011-01-02 12:31:15")}, 
         new object[] {"c", DateTime.Parse(" 2011-01-02 12:31:59")}, 
         new object[] {"d", DateTime.Parse(" 2011-01-02 12:32:01")}, 
         new object[] {"e", DateTime.Parse(" 2011-01-02 12:32:30")}, 
         new object[] {"f", DateTime.Parse(" 2011-01-02 12:33:10")}, 
        }; 

     var result = from pair in a 
        let msg = (string) ((object[]) pair)[0] 
        let date = (DateTime) ((object[]) pair)[1] 
        group new {date, msg} by new {date.Year, date.Month, date.Day, date.Hour, date.Minute} 
        into dateGroup 
        select dateGroup.OrderBy(dg => dg.date).Last(); 

     foreach (var res in result) 
     { 
      Console.WriteLine(res.msg); 
     } 
    } 
0

不確定的確切的語法,但下面可以幫助。您可以進一步調整sql性能。

選擇sometable *凡在ID(選擇從sometable組的日期,小時maxid,最小值)

+0

問題是關於實體框架... –

+0

如果您在該表中有很多條目,我會建議將時間戳分成日期,小時,分鐘(如果需要的話可以秒) – tehvan

+0

也許DATEPART可以幫助您.... http://msdn.microsoft.com/it-it/library/ms174420.aspx – 2GDev

0
SELECT 
    MAX([Message]) 
FROM 
    [Messages] 
GROUP BY 
    DATEPART(yyyy, [Timestamp]) 
    ,DATEPART(mm, [Timestamp]) 
    ,DATEPART(dd, [Timestamp]) 
    ,DATEPART(hh, [Timestamp]) 
    ,DATEPART(mi, [Timestamp]) 

這假定消息列與時間戳列作爲您的樣本數據顯示相關。

UPDATE

剛剛看到,這是尋找EF,不直SQL。 @Ross似乎有LINQ查詢的答案。我將把這裏的SQL留給參考。