Linq在组内的2个日期之间查询数据

时间:2015-03-04 09:58:56

标签: c# sql-server linq datetime linq-to-entities

我正在尝试使用Linq查询我的MS SQL数据库。代码是

var ids = (from o in _visitDetail
                   group o by o.CompanyId into grouped
                   where (grouped.Max(s => s.DateTime) - grouped.Min(s => s.DateTime)).TotalDays > 0
                   select grouped);

这导致抛出异常:

  

" DbArithmeticExpression参数必须具有数字公共类型。"

我认为它并不认为类型是相同的,所以我需要将它们转换为DateTime,因此它对于Linq来说非常清楚。

var ids = (from o in _visitDetail
                   group o by o.CompanyId into grouped
                   where (grouped.Max(s => Convert.ToDateTime(s.DateTime)) - grouped.Min(s => Convert.ToDateTime(s.DateTime))).TotalDays > 0
                   select grouped);

另一个例外:

  

" LINQ to Entities无法识别方法' System.DateTime ToDateTime(System.DateTime)'方法,并且此方法无法转换为商店表达式。"

在这些范围之间进行查询需要做什么?

1 个答案:

答案 0 :(得分:4)

在EF中使用日期和时间执行算术运算不支持。 EntityFramework无法将您的代码转换为SQL。而不是你可以使用EntityFunctions.DiffDays( startExpression, endExpression)方法:

var ids = from o in _visitDetail
          group o by o.CompanyId into grouped
          where (EntityFunctions.DiffDays(grouped.Min(s => s.DateTime), grouped.Max(s => s.DateTime))) > 0
          select grouped;

其他信息:

EntityFunctions方法称为 规范函数 。这些是一组功能,所有实体框架提供程序都支持这些功能。这些规范函数将转换为提供程序的相应数据源功能。规范函数是访问核心语言之外的功能的首选方法,因为它们可以使查询保持可移植性。

您可以找到所有规范函数here以及所有日期和时间规范函数here

不要忘记添加对System.Data.ObjectsSystem.Data.Entity的引用。