作者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://www.ptt.cc/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
抱歉最近一直瘋狂加班 現在才上來回
→ qa17b: 轉datetime比較啊? 10/08 23:17
有試過 keyWord.And(k =>Convert.ToDateTime(k.CreatDay) > 輸入時間)
但Linq中無法辨識這樣的方法
→ t64141: 假設DB轉date的api是to_date(), 試試 oracle to_date by l 10/09 00:38
→ t64141: inq之類的關鍵字 10/09 00:38
→ t64141: 順便吐槽一下前人,時間欄位用nvarchar是在想什麼... 10/09 00:43
→ t64141: 再不行就只能用SP處理後再給程式呼叫了 10/09 00:45
有找過類似的方法 不過沒有試成功QQ
用nvarchar真的是頭蠻痛的XD 而且有很多欄位都是類似情況(默
推 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);
→ 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