2011-07-19 116 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留给参考。