由于以前的数据库设计不是很标准,有几个存放日期的栏位设定的是字符串类型,以前用sql查询的时候可应用convert函数将字符串转换成日期在做比较。
现在我想要用EF重写系统,用Lambda表达式树做查询条件,当有日期比较的时候就遇到了一个问题:由于日期栏位设置的是字符串类型所以做查询比较的时候就必须要转换成datetime类型,代码如下
Expression<Func<V_PCDInfo, bool>> whereLambda = u => true;//定义查询表达式
if (dtFrom.IsNotNullOrEmpty() && dtTo.IsNotNullOrEmpty())
{
DateTime from = dtFrom.ToDateTime();//这里是传入的查询条件
DateTime to = dtTo.ToDateTime();//这里是传入的查询条件
whereLambda = u => u != null;//日期栏位不能为空
whereLambda = u => Convert.ToDateTime(u.PKDAT) > from && Convert.ToDateTime(u.PKDAT) < to;
}
这样,就会报出错误:
LINQ to Entities 不识别方法“System.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式。
有没有人遇到过这种情况啊,改如何解决呢?
(不要告诉我需要重新修改数据库定义。。。)
Convert.ToDateTime()
这是你自己写的方法 ,请不要在查询,怎么说呢??就比如 Linq To Entity.ToList()的时候使用自己的方法。
你可以在查询后的结果集中使用自定义方法。
不知道我这么说你明白不,好想表达的有点不清晰。
怎么会表述不清呢,应该就是表达式树里面的Convert.ToDateTime(u.PKDAT) 不能被解析成sql语句吧,不知道有没有什么替代方案呢
你的意思是先不管时间条件直接查询出结果,然后在根据时间范围做筛选吗?
不知道你有没有实际操作过呢,能否给予一个示例代码啊,灰常感谢。
u.PKDAT.ToDateTime()?
ToDateTime是我自定义的一个扩展方法,就是把字符串转换成日期类型。
这个应该是没有影响的,我觉得主要是Convert.ToDateTime(u.PKDAT)这一段不能被解析成Sql语句。
但是,我又找不到好的解决方法啊。
Convert.ToDateTime(u.PKDAT)这一段不能被解析成Sql语句。确实是这样的
试试用 DateTime.TryParseExact(input,"dd-MM-yyyy")
这个好像也是不行哦
哥们, 这种查询是不支持转换的, 你必须提前转换好然后才可以
先用一个变量存得转换或者计算的值,但用linq
可使用SqlFunctions类
lamda不支持转换
Try this:
whereLambda = u => String.Compare(u.PKDAT, from)>=0 && String.Compare(u.PKDAT, to)<=0;