2012-08-16 24 views
2

如何使用EF获得年龄超过21岁的人员?实体框架和时间范围计算

from person in context.Persons 
where DateTime.UtcNow - person.Dob > TimeSpan.FromHours(184086) 
select new {person, Age = DateTime.UtcNow - person.Dob} 

以上失败。

我能做些什么来解决这个问题?以上版本的EF支持如上。 4.2+

我可以如下访问DateTime结构的属性吗?

from person in context.Persons 
where DateTime.UtcNow.Year - person.Dob.Year > 21 
select new {person, Age = DateTime.UtcNow.Year - person.Dob.Year} 
+0

“上面的失败。”它是如何失败的?错误信息?不正确的结果? – 2012-08-16 14:30:26

回答

4

您可以在linq-to-entites查询中使用<运算符。尽管如此,你不能使用加法或减法。幸运的是,SqlFunctions具有计算日期差异的功能。所以你可以做的是:

var d21 = DateTime.Today.AddYears(-21); 
var q = from person in context.Persons 
     where person.Dob < d21 
     select new 
     { 
      person, 
      Age = SqlFunctions.DateDiff("year", person.Dob, DateTime.Today) 
     } 

你必须创建变量d21第一,否则EF抱怨不知道AddYears

+0

哎哟,这很复杂,应该很简单。 – Alwyn 2012-08-16 16:04:18

+1

是的,linq-to-sql确实可以处理日期加/减,但是它会生成可能会影响性能的sql表达式的怪物。 SqlFunctions使用数据库功能。 – 2012-08-16 17:26:30

+0

不知道SqlFunctions的存在。谢谢格特的启发。 – 2013-07-16 19:14:35