是這樣的今天我想做一個日期查詢功能,結果如下圖
我是能成功地查出到職日12/25離職日12/28的資料
可是我若沒給日期,就顯示查無資料,想請問我LINQ指令該如何下才能
有給日期就能查到我要的資料,沒給日期就顯示所有資料?
如下圖這樣
屬性
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;
}
如果是我會把敘述句拆開用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>();
LINQ
在ToList()
執行之前都是IEnumerable<T>
所以還能一直附加條件,因為他還沒從資料庫拉出資料
請問這寫法有版本限定嗎?我的是VS2015
tenno081
喔我少個分號;
@@
阿想起來了,我好像不能用這個判斷,我們有特意把西元轉民國
那個方法裡有一段是只要是null會塞一個指定日期
tenno081
結果你白忙一場了
不,還是感謝您,您這個寫法也給了我啟發,最後我確實做出來了
用這個方式
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那段拿掉後還可以顯示所有資料請問原因是?
tenno081
那個foreach應該沒必要
LINQ的WHERE方法內部原本就會跑迴圈
但是不這樣做我想要查到指定資料且沒給值時就顯示所有資料的功能好像無法實現
tenno081
你該不會是誤會成裡面的東西也拿掉吧
我是說foreach拿掉
裡面if的東西要留著啊
我懂你的意思,只是我目前暫時無法使用不用foreach的方法,只好等日後有新想法時再來改了
我不知道LINQ該怎麼寫,不過通常是沒有就把where拿掉。
要不然還有個辦法,給預設值,startdate 就用系統啟用日,enddate就給系統的明天
Django的ORM的話,我會透過鏈狀過濾來做。
通常我會先對送來的request做過濾鍵值和轉型的動作。
然後對得到的結果,每項鍵值來做迭代。
LINQ我就不知道能不能這樣做。
可以試試
where ((startdate == null || enddate == null) || (x.ARRIVE_DATE == startdate && x.LEAVE_DATE == enddate))