使用Entity ObjectContext和For循环迭代确定每分钟的行数

本文关键字:每分钟 迭代 ObjectContext Entity For 循环 使用 | 更新日期: 2023-09-27 18:26:33

我有一个SQL Server 2008表,其中一列的数据类型为datetime。我想要一个实体查询,它为每分钟的间隔生成行数。例如,结果如下:

1. 7/3/2011 14:00:00 | 1000
2. 7/3/2011 14:01:00 | 1097

第一行意味着1000行的datetime值介于2011年7月3日13:59:00和2011年3月7日14:00:00之间。

第二行意味着1097行的datetime值介于2011年7月3日14:00:00和2011年3月7日14:01:00之间。

我可以用这个sql查询得到这个结果

select 
stamp = dateadd(mi,datediff(mi,0,[date]) + 1,0),
rows = count(1) from WMLSLog group by dateadd(minute,datediff(mi,0,[date])+1,0) 
order by stamp asc

结果:

- stamp                 rows
- 2012-03-03 16:54:00.000   55
- 2012-03-03 16:55:00.000   120
- 2012-03-03 16:56:00.000   120

有人能帮我使用实体框架获得这个吗

public IQueryable<WMLSLog> GetWMLSLogs()
    {
        var result = this.ObjectContext.WMLSLogs..........;
        //This returns a DateStamp and Count
    }

或者使用for循环从IQueryable<WMLSLog>返回的集合中获取结果。

使用Entity ObjectContext和For循环迭代确定每分钟的行数

经过大量的研究,我发现.Net 4获得了System.Data.Objects.SqlClient下的大多数sql函数。它拥有大多数常见的sql函数,如DateDiff、DateAdd等。所以我在实体到Linq的查询中使用了它们。

 DateTime zeroDate = new DateTime(2008, 1, 1, 0, 0, 0);
        this.ObjectContext.WMLSLogs.GroupBy(s => SqlFunctions.DateAdd("mi", ((SqlFunctions.DateDiff("mi", zeroDate, s.Date))), zeroDate)).
            Select(g => new
                {
                    Date = g.Key,
                    count = g.Count()
                }).OrderBy(x => x.Date);

我得到了预期的结果。