我需要使用实体框架(代码优先方法)和SQL Server为 ASP.NET Web应用程序生成一些周摘要。
更多的应用程序在客户端运行,服务器仅通过OData(Breeze.js提供对实体的访问。不幸的是,Breeze不支持聚合函数,所以我必须在服务器端实现一些控制器操作,以满足一些更复杂的查询,例如:
var query = from r in db.Context.Records
where r.MeasurementId == measurementId
group r by SqlFunctions.DatePart("WK", r.Time) into g
select new
{
Time = g.Min(r => r.Time),
MinImport = g.Min(r => r.Import),
...
};
我使用的是LINQ而不是上下文SqlQuery<T>
,因为它返回IQueryable
而不是IEnumerable
。
问题出在日期上。记录按周分组,但默认情况下周从星期日开始,但是我需要它从星期一开始。通过运行以下命令,可以在普通SQL中非常容易地解决此问题:
SET DATEFIRST 1;
但是我在实体框架中找不到任何解决方案。是否可以在初始化后或DbContext
期间立即运行一些查询来设置DATEFIRST
?
尝试:
var query = from r in db.Context.Records
where r.MeasurementId == measurementId
group r by SqlFunctions.DatePart("WK", SqlFunctions.DateAdd("Day",-1,r.Time)) into g
select new
{
Time = g.Min(r => r.Time),
MinImport = g.Min(r => r.Import),
...
};