我正在尝试使用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)'方法,并且此方法无法转换为商店表达式。"
在这些范围之间进行查询需要做什么?
答案 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.Objects
和System.Data.Entity
的引用。