作者windofsmile (微笑之风)
看板C_Sharp
标题[问题] PredicateBuilder string互相比较问题
时间Mon Oct 8 23:13:19 2018
各位版上的大大们好 小弟遇到卡了许久的瓶颈
在专案中的Service层中有用到PredicateBuilder
用以承接SQL的资料
像是var keyword = PredicateBuilder.New<Model>();
keyword = keyword.And(m =>m.sex =="male");
keyword = keyword.And(m =>m.birthday >= "输入者选择的日期");
最後再
return UserRepository.Queryable().AsExpandable().Where(keyWord);
类似这样的写法。
在关键字的搜索方面都很顺,没什麽型别上的问题,
但birthday这边遇到了很大的瓶颈。
小弟想让使用者选择特定时间区段後,Service捞出该区间的使用者资讯
由於SQL中的栏位定义是nvarchar,也不能够随意更动SQL的栏位,
以日期A、B为判断,拿来与资料库中的birthday做比较(nvarchar)
在keyword = keyword.And(m => m.birthday >= "使用者选择的日期A");
keyword = keyword.And(m => m.birthday <= "使用者选择的日期B");
的时候,就会一直被卡住,错误讯息是string不能够与string做比较
使用者选择的日期A、B我有办法将它转为int 唯独m.birthday不知如何下手。
小弟因为对linq不熟
一开始试过Convert.Int16(m.birthday) ; int.parse(m.birthday)等常用转型方式
到後来google才发现在linQ中是没办法使用这样的转型方式的
也查到许多资料,但大部分都是纯linq的语法,PredicateBuilder的方法资讯不多
因此突然间不知道该怎麽突破这个障碍...
如果版上的大大们有可以提供的google方向,或是一些想法
希望大大们可以不吝指教<_O_>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.27.101.204
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1539011602.A.4AD.html
※ 编辑: windofsmile (114.27.101.204), 10/08/2018 23:14:55
※ 编辑: windofsmile (114.27.101.204), 10/08/2018 23:15:35
抱歉最近一直疯狂加班 现在才上来回
1F:→ qa17b: 转datetime比较啊? 10/08 23:17
有试过 keyWord.And(k =>Convert.ToDateTime(k.CreatDay) > 输入时间)
但Linq中无法辨识这样的方法
2F:→ t64141: 假设DB转date的api是to_date(), 试试 oracle to_date by l 10/09 00:38
3F:→ t64141: inq之类的关键字 10/09 00:38
4F:→ t64141: 顺便吐槽一下前人,时间栏位用nvarchar是在想什麽... 10/09 00:43
5F:→ t64141: 再不行就只能用SP处理後再给程式呼叫了 10/09 00:45
有找过类似的方法 不过没有试成功QQ
用nvarchar真的是头蛮痛的XD 而且有很多栏位都是类似情况(默
6F:推 chentsungmin: 使用 String.Compare 比较试试 10/09 01:00
後来使用String.Compare成功解出来了
keyWord = keyWord.And(m => string.Compare(m.birthday , 起始日) >= 0);
keyWord = keyWord.And(m => string.Compare(m.birthday , 终止日) <= 0);
7F:→ ATPS4869: 试试 DbFuntions.CreateDateTime 10/09 18:18
这个方法後来也有试过,还是有转型的问题(linq)
感谢楼上各位大大的指点QQ
※ 编辑: windofsmile (211.20.227.179), 10/17/2018 10:45:44
※ 编辑: windofsmile (211.20.227.179), 10/17/2018 10:46:18
※ 编辑: windofsmile (211.20.227.179), 10/17/2018 10:47:09