在LINQ中检查年龄filter的最短方法?

我试图检查某个范围内的人 – 让lb-lowerbound和ub-upper对应例如年龄组lb = 18和ub = 24意味着我试图过滤掉18到24岁之间的人。出生日期数据库中的日期时间字段可以为空。我有这个代码 –

var users=from e in employee where e.DOB.HasValue && ((DateTime.Now.Year - e.DOB.Value.Year)) >= lb) && ((DateTime.Now.Year - e.DOB.Value.Year) <= ub) select e; 

但这只是用年份检查我如何使用月份并找出实际年龄并根据年龄筛选出用户? 谢谢大家的帮助。

首先,该查询在一年中的时间方面是不正确的 – 例如,您可能是17岁,仍然算作18岁 – 截至今天(2011年1月17日),1993年出生的人数很少。 此外,它计算DateTime.Now多次,这意味着查询执行时年份可能会有所不同。

最后,如果您只有一个where子句并且您的select子句是无操作,则使用扩展方法语法而不是查询表达式通常更简单。

我会建议:

 DateTime today = DateTime.Today; DateTime min = today.AddYears(-ub); DateTime max = today.AddYears(-lb); var years = employee.Where(e => e.DOB != null && e.DOB >= min && e.DOB <= max); 

编辑:更清楚的是,对于最大年龄(比方说)10,这意味着你想要排除出生日期是11年或更长的人,所以你写道:

 DateTime today = DateTime.Today; DateTime min = today.AddYears(-(maxAge + 1)); DateTime max = today.AddYears(-minAge); var years = employee.Where(e => e.DOB != null && e.DOB > min && e.DOB <= max); 

这应该做的伎俩(未测试):

 var users = from e in employee where e.DOB.HasValue && (DateTime.Today - e.DOB.Value.Date) >= min.Date && e.DOB.Date <= max.Date select e;