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

时间:2012-03-04 22:04:38

标签: c# sql-server-2008 entity-framework linq-to-entities

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

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

第一行意味着1000行在7/3/2011 13:59:00和7/3/2011 14:00:00之间具有datetime值。

第二行意味着1097行在7/3/2011 14:00:00和7/3/2011 14:01:00之间具有datetime值。

我可以使用此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

有人可以帮助我使用Entity Framework

来解决这个问题
public IQueryable<WMLSLog> GetWMLSLogs()
    {
        var result = this.ObjectContext.WMLSLogs..........;
        //This returns a DateStamp and Count
    }

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

1 个答案:

答案 0 :(得分:0)

经过大量研究后,我发现.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);

我得到了预期的结果。