iT邦幫忙

0

日期查詢功能求解

是這樣的今天我想做一個日期查詢功能,結果如下圖
https://ithelp.ithome.com.tw/upload/images/20181227/20110132C2WpAVWH1I.jpg
我是能成功地查出到職日12/25離職日12/28的資料
可是我若沒給日期,就顯示查無資料,想請問我LINQ指令該如何下才能
有給日期就能查到我要的資料,沒給日期就顯示所有資料?

如下圖這樣
https://ithelp.ithome.com.tw/upload/images/20181227/20110132IuOFpGGOuI.jpg
屬性

public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }

linq語法

 public List<EmployeeDto> FindEmployee(string cid ,DateTime startdate,DateTime enddate)
        {
           
            var query = (from x in _repo.EMPLOYEE                 
                         where  (x.ARRIVE_DATE==startdate && x.LEAVE_DATE ==enddate)                 
                         select new EmployeeDto
                         {
                             GUID =x.GUID,
                             CID =x.CID,
                             EMP_TYPE =x.EMP_TYPE,
                             EMP_ID =x.EMP_ID,
                             DR_ID =x.DR_ID,
                             EMP_NAME =x.EMP_NAME,
                             POSITION_ID = x.POSITION_ID,
                             ARRIVE_DATE = x.ARRIVE_DATE,
                             LEAVE_DATE=x.LEAVE_DATE,
                             CRE_DATE=x.CRE_DATE,
                             CRE_UID=x.CRE_UID,
                             MOD_DATE=x.MOD_DATE,
                             MOD_UID=x.MOD_UID,
                             STATUS =x.STATUS
                         }).ToList<EmployeeDto>();
            return query;
        }
1
Homura
iT邦研究生 1 級 ‧ 2018-12-27 13:49:57
最佳解答

如果是我會把敘述句拆開用LINQ方法來組成

var query = _repo.EMPLOYEE.Select(x => new EmployeeDto
     {
         GUID =x.GUID,
         CID =x.CID,
         EMP_TYPE =x.EMP_TYPE,
         EMP_ID =x.EMP_ID,
         DR_ID =x.DR_ID,
         EMP_NAME =x.EMP_NAME,
         POSITION_ID = x.POSITION_ID,
         ARRIVE_DATE = x.ARRIVE_DATE,
         LEAVE_DATE=x.LEAVE_DATE,
         CRE_DATE=x.CRE_DATE,
         CRE_UID=x.CRE_UID,
         MOD_DATE=x.MOD_DATE,
         MOD_UID=x.MOD_UID,
         STATUS =x.STATUS
     }
);

if (startdate == null && enddate == null)
{    
    query = query.Where(x => x.ARRIVE_DATE==startdate && x.LEAVE_DATE ==enddate)
}            
        
return query.ToList<EmployeeDto>();

LINQToList()執行之前都是IEnumerable<T>所以還能一直附加條件,因為他還沒從資料庫拉出資料

看更多先前的回應...收起先前的回應...
tenno081 iT邦新手 5 級 ‧ 2018-12-27 14:00:43 檢舉

請問這寫法有版本限定嗎?我的是VS2015
https://ithelp.ithome.com.tw/upload/images/20181227/20110132Nh7DO9xcFG.jpg

Homura iT邦研究生 1 級 ‧ 2018-12-27 14:02:12 檢舉

tenno081
喔我少個分號;@@

tenno081 iT邦新手 5 級 ‧ 2018-12-27 14:24:12 檢舉

阿想起來了,我好像不能用這個判斷,我們有特意把西元轉民國
那個方法裡有一段是只要是null會塞一個指定日期

Homura iT邦研究生 1 級 ‧ 2018-12-27 14:28:57 檢舉

tenno081
結果你白忙一場了/images/emoticon/emoticon16.gif

tenno081 iT邦新手 5 級 ‧ 2018-12-27 14:34:29 檢舉

不,還是感謝您,您這個寫法也給了我啟發,最後我確實做出來了
用這個方式

 public List<EmployeeDto> FindEmployee(string cid,DateTime startdate,DateTime enddate)
        {

            var query = (from x in _repo.EMPLOYEE
                         where
                         (x.CID == cid)             
                         select new EmployeeDto
                         {
                             GUID = x.GUID,
                             CID = x.CID,
                             EMP_TYPE = x.EMP_TYPE,
                             EMP_ID = x.EMP_ID,
                             DR_ID = x.DR_ID,
                             EMP_NAME = x.EMP_NAME,
                             POSITION_ID = x.POSITION_ID,
                             ARRIVE_DATE = x.ARRIVE_DATE,
                             LEAVE_DATE = x.LEAVE_DATE,
                             CRE_DATE = x.CRE_DATE,
                             CRE_UID = x.CRE_UID,
                             MOD_DATE = x.MOD_DATE,
                             MOD_UID = x.MOD_UID,
                             STATUS = x.STATUS
                         });
            foreach (EmployeeDto dto in query)
            {
                if (dto.ARRIVE_DATE == startdate && dto.LEAVE_DATE == enddate)
                {
                    query = query.Where(x => x.ARRIVE_DATE == startdate && x.LEAVE_DATE == enddate);
                }
            }
            return query.OrderByDescending(x => x.ARRIVE_DATE).ToList<EmployeeDto>();     
        }

但這個好像資料一多就不太好,然後有一點我不太懂,我把
foreach那段拿掉後還可以顯示所有資料請問原因是?

Homura iT邦研究生 1 級 ‧ 2018-12-27 14:41:13 檢舉

tenno081
那個foreach應該沒必要
LINQ的WHERE方法內部原本就會跑迴圈/images/emoticon/emoticon16.gif

tenno081 iT邦新手 5 級 ‧ 2018-12-27 14:48:36 檢舉

但是不這樣做我想要查到指定資料且沒給值時就顯示所有資料的功能好像無法實現/images/emoticon/emoticon02.gif

Homura iT邦研究生 1 級 ‧ 2018-12-27 14:55:56 檢舉

tenno081
你該不會是誤會成裡面的東西也拿掉吧
我是說foreach拿掉
裡面if的東西要留著啊/images/emoticon/emoticon04.gif

tenno081 iT邦新手 5 級 ‧ 2018-12-27 15:07:32 檢舉

我懂你的意思,只是我目前暫時無法使用不用foreach的方法,只好等日後有新想法時再來改了/images/emoticon/emoticon06.gif

0
froce
iT邦高手 1 級 ‧ 2018-12-27 12:40:58

我不知道LINQ該怎麼寫,不過通常是沒有就把where拿掉。
要不然還有個辦法,給預設值,startdate 就用系統啟用日,enddate就給系統的明天

Django的ORM的話,我會透過鏈狀過濾來做。
通常我會先對送來的request做過濾鍵值和轉型的動作。
然後對得到的結果,每項鍵值來做迭代。
LINQ我就不知道能不能這樣做。

tenno081 iT邦新手 5 級 ‧ 2018-12-27 13:22:13 檢舉

不好意思,我好像表達錯誤,有更改一下內文,請您再看看,謝謝

小魚 iT邦高手 1 級 ‧ 2018-12-27 15:13:54 檢舉

拿掉where + 1

0
niodoruku
iT邦新手 5 級 ‧ 2018-12-27 13:38:25

可以試試

where ((startdate == null || enddate == null) || (x.ARRIVE_DATE == startdate && x.LEAVE_DATE == enddate))
tenno081 iT邦新手 5 級 ‧ 2018-12-27 13:54:05 檢舉

抱歉,顯示出來是查無資料
我好像只能查出範圍,而無法準確地查出單一資料且無給值時能全部顯示

(x.ARRIVE_DATE>=startdate && x.LEAVE_DATE >=enddate)  

我要發表回答

立即登入回答