Linq动态查询--Expression.LessThan问题

cabps 2009-08-24 10:38:03
right = Expression.Constant(Convert.ToDateTime(outTime));
right = Expression.Convert(right, typeof(DateTime));
left = Expression.Property(param, typeof(Table1).GetProperty("OutOfTime"));
filter = Expression.LessThan(left, right);

其中OutOfTime字段在Table1表中为DateTime类型并且为可空,这时问题来了。
Expression.LessThan拼接filter时说"The binary operator Equal is not defined for the types 'System.Nullable`1[System.DateTime]' and 'System.DateTime'."
自己搜了半天,搜到的结果都说这个错误是由于Expression的两边都必须为同一类型导致(the expression tree needs both sides of the expression to be the same type)。不太明白,OutOfTime此时明明不为空,为什么不能比较?
不光LessThan,LessThanOrEqual、GreaterThan、GreaterThanOrEqual也存在相同问题。
如何解决?请各位高人不吝赐教,谢谢。
...全文
394 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
祖松科技 2009-11-20
  • 打赏
  • 举报
回复
兄弟谢谢你们,我碰到了同样的问题,花了几个小时找解决方法,总算在这里解决了问题!
cabps 2009-08-25
  • 打赏
  • 举报
回复
自己搞定了,用Expression.Convert将DateTime?转换成DateTime。
唉,就这一句费了将近一天的时间。
cabps 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]
我从来不使用 Linq.Expressions。如果你只是应用Linq的高级功能,而不是觉得它实在太差了需要你动手从内部重构它,最好不要写这类代码。

如果你写成 linq 查询表达式,或许可以帮你看看。
[/Quote]
我这儿不能直接写Linq表达式,因查询字段数量不是一定的,而是必须根据用户给的查询条件动态生成Linq查询。
而动态生成Linq如何处理可空字段一直让我很头疼。
  • 打赏
  • 举报
回复
我从来不使用 Linq.Expressions。如果你只是应用Linq的高级功能,而不是觉得它实在太差了需要你动手从内部重构它,最好不要写这类代码。

如果你写成 linq 查询表达式,或许可以帮你看看。
cabps 2009-08-24
  • 打赏
  • 举报
回复
第二句: right = Expression.Convert(right, typeof(DateTime)); 不要,复制粘贴时搞错了。
修正一下。
chengcheng1253 2009-08-24
  • 打赏
  • 举报
回复
帮顶
huyou1983218 2009-08-24
  • 打赏
  • 举报
回复
帮顶
cabps 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ivony 的回复:]
DateTime? left;
DateTime right;

left < right
你觉得这能编译么?解决方案一样。
[/Quote]
不明白你的意思。能否解释一下?
left, right和filter都是Expression对象。
我的这种做法在对nullable为false的字段时可行,但一遇到nullable=true的就不行了。
Ivony 2009-08-24
  • 打赏
  • 举报
回复
DateTime? left;
DateTime right;

left < right
你觉得这能编译么?解决方案一样。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧