4-3.ASP.NET Core Web API 入門教學 - 關鍵字搜尋

ASP.NET Core Web API 入門教學

這篇文章要來說說,如果要做關鍵字搜尋的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;
}

這樣子當沒有任何參數時,依然會正常撈取全部資料,那有參數時就會進行過濾,是不是很簡單呢?想看更完整的流程可以看影片。

新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏

範例檔下載:下載




Copyright © 凱哥寫程式 2022 | Powered by TalllKai ❤