终于会员年龄不工作了
Posted
技术标签:
【中文标题】终于会员年龄不工作了【英文标题】:finally the member age is not workng 【发布时间】:2011-11-18 00:07:20 【问题描述】:我正在尝试检查某个范围内的人 - 让 minage 和 maxage 对应于例如minage=18 和 maxage =24 的年龄组意味着我正在尝试过滤掉 18 到 24 岁之间的人。成员 dob 的数据类型也是字符串..
我正在尝试这个
int agefrom = Convert.ToInt32(cbGEFrom.Text);
int ageto = Convert.ToInt32(cbGETo.Text);
DateTime today = DateTime.Today;
DateTime max = today.AddYears(-(agefrom + 1));
DateTime min = today.AddYears(-(ageto));
string maxage = Convert.ToString(max);
string minage = Convert.ToString(min);
var members =
from report in eclipse.members
where string.Compare(report.member_Dob,minage) >=0
where string.Compare(report.member_Dob,maxage) < 0
select report;
我在下面试过这个
var members = from report in eclipse.members
let dob = DateTime.Parse(report.member_Dob) // or use ParseExact
where dob >= minDOB && dob < maxDOB
select report;
但是 linq to entity 不支持这一行
let dob = DateTime.Parse(report.member_Dob) // or use ParseExact
不幸的是 member_dob 的数据类型是字符串,我无法更改架构...
有没有人能给出这样做的任何想法...
【问题讨论】:
你不能改变架构,但是你能在数据库中添加一个函数吗? 我可能会在该表的数据库中创建一个视图,将字符串转换为日期,然后将该视图添加到 linq 上下文文件中。 【参考方案1】:看看这个帖子Linq to Entities DateTime Conversion
我认为它有您正在寻找的答案。
【讨论】:
【参考方案2】:如果您不介意此表达式生成的 sql 并且您的所有字符串值都是有效的 DateTime,您可以这样做:
var members = from report in eclipse.members
let dob = eclipse.members.Take(1).Select(x => report.member_Dob).Cast<DateTime>().FirstOrDefault()
where dob >= minDOB && dob < maxDOB
select report;
【讨论】:
@Magnus - 这仅在所有字符串都可以转换为所需类型时才有效。它适用于整数、双精度和日期时间 @Magnus - 实体框架允许转换可枚举序列,但不能转换单个值。所以我正在创建一个只有我想要的项目的可枚举,将其转换,然后将其作为值返回eclipse.members.Take(1)
总是取相同的值?而不是您选择x
并且从不使用它?
@Magnus - 我只是用它来创建一个 Enumerable,我只对将 report.member_Dob 转换为 DateTime 感兴趣。理想情况下我可以做到 DateTime.Parse(report.member_Dob),但 EF 不支持它以上是关于终于会员年龄不工作了的主要内容,如果未能解决你的问题,请参考以下文章