這篇文章要來說說,如果要做關鍵字搜尋的API該怎麼實作呢?
那通常我們會用GET傳參數的方法來傳遞需要過濾的關鍵字,那GET方法該如何傳遞參數呢?有做過網站的人一定知道,就是在網址結尾處加個?後面並使用&就可以串你的參數了。
例如:api/news?id=xxxx&id2=xxxx
其中id是你欄位名稱,xxxx則是你的參數,然後有多個參數可以用&來做隔開,那有了這個基礎知識後,我們就要來開始串參數瞜。
首先我的News資料表我打算針對Title、Content和StartDateTime做過濾,所以在網址的部分我們可以這樣下,api/news?Title=xxxx&Content=xxxx&StartDateTime=xxxx
。
那在我們程式中該如何接收到這三個值(xxxx部分)呢?
這是上一節撈取全部資料的API,再加上接收參數的程式碼:
public IEnumerable<NewsDto> Get(string title, string content, DateTime? startDateTime)
{
var result = from a in _webContext.News
select new NewsDto
{
Title = a.Title,
Content = a.Content,
NewsId = a.NewsId,
StartDateTime = a.StartDateTime,
EndDateTime = a.EndDateTime,
Click = a.Click
};
return result;
}
以上參數命名大小寫是不拘的,會視為一樣
我們會在這支函式接受參數的地方打上對應的欄位名稱和型別,其中在型別後面加?是表示這個參數不一定會有值過來,如果沒有值傳過來就會是null,因為我們關鍵字搜尋並不一定每個欄位都要做過濾,常常會是部分過濾而已,因此沒傳值的就讓它等於null好讓我們做後續的判斷,那其中string沒傳值時會是空字串,所以不用加也不能加。
接著我們就要來寫過濾的程式了,首先一樣先撈出全部,但撈出全部後我們一個一個參數來做判斷過濾。
先判斷title是不是空白或空值,如果是我們就進行過濾,那我們這邊就是將一開始撈到的全部結果,再進行二次條件過濾result.Where(a => a.Title == title)
,那a.Title == title
就是找尋Title欄位有沒有符合傳來的參數title一樣的資料,有的話則留下來。
if (!string.IsNullOrWhiteSpace(title))
{
result = result.Where(a => a.Title == title);
}
接著再判斷content是不是空白或空值,就進行過濾,寫法如下。這邊換了一個寫法a.Content.Contains(content)
,跟title不同的是title要完全一致,而這邊只要有部分一致就算符合規則,但其實title搜尋應該也是要用部分一致,不過這邊因為要示範,所以用==完全一致來示範
if (!string.IsNullOrWhiteSpace(content))
{
result = result.Where(a => a.Content.Contains(content));
}
最後就判斷startDateTime如果不是null的話,也進行過濾,這邊我們只過濾到日期就好,寫法如下。
if (startDateTime != null)
{
result = result.Where(a => a.StartDateTime.Date == ((DateTime)startDateTime).Date);
}
那這樣經過三次判斷後,最後的result就會是我們所搜尋符合結果的資料了,可以分別試試不同條件下,是否成功撈出符合的資料。
多個條件
改造完原有的撈取全部資料後的程式碼:
[HttpGet("GetKeyWord")]
public IEnumerable<NewsDto> GetKeyWord(string title, string content, DateTime? startDateTime)
{
var result = from a in _webContext.News
select new NewsDto
{
Title = a.Title,
Content = a.Content,
NewsId = a.NewsId,
StartDateTime = a.StartDateTime,
EndDateTime = a.EndDateTime,
Click = a.Click
};
if (!string.IsNullOrWhiteSpace(title))
{
result = result.Where(a => a.Title == title);
}
if (!string.IsNullOrWhiteSpace(content))
{
result = result.Where(a => a.Content.Contains(content));
}
if (startDateTime != null)
{
result = result.Where(a => a.StartDateTime.Date == ((DateTime)startDateTime).Date);
}
return result;
}
這樣子當沒有任何參數時,依然會正常撈取全部資料,那有參數時就會進行過濾,是不是很簡單呢?想看更完整的流程可以看影片。
新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏
範例檔下載:下載