ASP.NET Core Web API 入門教學 - 取得資料與指定資料


Posted by TalllKai on 2021-04-20

影片講解(有字幕):


這篇就要開始講如何從資料庫讀取資料,接著會有一系列的讀取資料的做法,首先我們就先從最基本的開始講起。

這部分要來示範從TodoList資料表中讀取資料,那我們首先先創一個TodoController.cs(應該要取名為todolist跟資料表同名會比較好),還不會創新的Controller的人可以先看這裡(ASP.NET Core Web API 入門教學 - 創建第一支HelloWorld API),接著我們將DB物件注入這支TodoListController,還不會的人可以先看這裡(ASP.NET Core Web API 入門教學 - 使用資料庫物件取得資料表內容)

接著我們就要讀取TodoList資料表的資料了,回傳類別我們就使用TodoList,簡單讀取的方式會如下圖。

[HttpGet]
public IEnumerable<TodoList> Get()
{
    var result = _todoContext.TodoLists;

    return result;
}

這樣就可以讀取TodoList資料表中所有的資料了,執行啟動不偵錯就並在網址打上api/todo就會讀取出五筆資料。

但這樣會有一些不需要給使用者知道的欄位等一些問題,因此我們就要創一個dto來做轉換,還不知道DTO要做什麼的可以看這裡(什麼是DTO)

這邊會創一個DTOs資料夾,專門放dto的類別。那接著我們就創一個專門用在讀取todolist資料的dto,如下。

namespace Todo.Dtos
{
    public class TodoListSelectDto
    {
        public Guid TodoId { get; set; }
        public string Name { get; set; }
        public DateTime InsertTime { get; set; }
        public DateTime UpdateTime { get; set; }
        public bool Enable { get; set; }
        public int Orders { get; set; }
        public string InsertEmployeeName { get; set; }
        public string UpdateEmployeeName { get; set; }
    }
}

這邊我們拿掉了一些使用者不需要的欄位,並新增了兩個InsertEmployeeNameUpdateEmployeeName欄位。接著我們改造原有程式如下。

[HttpGet]
public IEnumerable<TodoListSelectDto> Get()
{
    var result = _todoContext.TodoLists
        .Select(a => new TodoListSelectDto
        {
            Enable = a.Enable,
            InsertEmployeeName = a.InsertEmployee.Name,
            InsertTime = a.InsertTime,
            Name = a.Name,
            Orders = a.Orders,
            TodoId = a.TodoId,
            UpdateEmployeeName = a.UpdateEmployee.Name,
            UpdateTime = a.UpdateTime
        });

    return result;
}

回傳的類別改為TodoListSelectDto,下面的內容則要自行一個一個欄位做對應給值。存個檔後再重新瀏覽api/todo。

顯示的欄位就變成我們重新對應的欄位了。如此我們就完成了一個讀取TodoList資料表全部資料的Web API了。

那接著我們要做讀取指定資料的API,先上範例程式。

[HttpGet("{id}")]
public TodoListSelectDto Get(Guid id)
{
    var result = _todoContext.TodoLists
        .Where(a => a.TodoId == id)
        .Select(a => new TodoListSelectDto
        {
            Enable = a.Enable,
            InsertEmployeeName = a.InsertEmployee.Name,
            InsertTime = a.InsertTime,
            Name = a.Name,
            Orders = a.Orders,
            TodoId = a.TodoId,
            UpdateEmployeeName = a.UpdateEmployee.Name,
            UpdateTime = a.UpdateTime
        }).SingleOrDefault();

    return result;
}

看到開頭[HttpGet("{id}")]的部分,比起讀取全部資料多了("{id}"),其中的()裡的字串為該支API的後續網址,以本案例為例子,如果[HttpGet("aa")]',則讀取該函式的網址會是api/todo/aa,那加了{}則代表說這會是個可變動的參數。

例如我一樣打上api/todo/aa的網址,那在[HttpGet("{id}")]情況下,我這個函式public TodoListSelectDto Get(Guid id)接受參數的位置(Guid id),就會接收到一個id,而這個id的值就會是網址上的aa。那接收的型別可以自訂,以本範例來說宣告型別為Guid,程式預設會幫你做型別轉換,但aa為普通字串無法轉成Guid,所以程式會報錯。

那where的部分是為了撈取指定的資料,所以我們將得到的參數id去等於TodoId以找到對應的資料,最後SingleOrDefault()部分則是指說這裡只會有一筆資料,當找不到資料的時候會回傳null,如果此時找出一筆以上的資料,那程式會報錯,這也算是一個除錯機制,因為主鍵一定只會有一筆,那如果你認定這邊只會有一筆就可以下SingleOrDefault(),出現一筆以上則報錯讓你檢查資料面是哪邊出現了問題。

最後我們執行/api/todo/1f3012b6-71ae-4e74-88fd-018ed53ed2d3,畫面就會出現該筆資料。

那當你亂打網址不是Guid格式時則會出現錯誤訊息。

以上就是讀取全部資料和指定資料的Web API簡單示範,想要聽多一些觀念的可以看影片。

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


#ASP.NET Core #Web API #.NET 5







Related Posts

[JavaScript] 用 Jest 做單元測試

[JavaScript] 用 Jest 做單元測試

原子習慣

原子習慣

如何使用 K8S 自動化定期 CronJob 抓網路公開資料

如何使用 K8S 自動化定期 CronJob 抓網路公開資料


Comments