影片講解(有字幕)
這篇就要開始講如何從資料庫讀取資料,接著會有一系列的讀取資料的做法,首先我們就先從最基本的開始講起。
這部分要來示範從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; }
}
}
這邊我們拿掉了一些使用者不需要的欄位,並新增了兩個InsertEmployeeName
和UpdateEmployeeName
欄位。接著我們改造原有程式如下。
[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簡單示範,想要聽多一些觀念的可以看影片。
新手分享學習成果,若有錯誤,煩請告知修正,感謝🙏