這一節要來學習如何取得指定的資料,首先先看到預設幫我們產生的結構
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
這個結構就是用來取得指定資料的結構,我們一個一個來看
如果沒有忘記的話,之前有提到改變網址的寫法
[Route("api/[controller]")]
可以在最上方的Route標籤中打上你要的網址
而子方法中上面的[HttpGet("{id}")]
也是可以改變網址,並且會跟Route
中宣告的網址組合起來
如果是[HttpGet("getOne")]
,呼叫該方法的網址會是api/news/getOne
那{id}加上了{}又是什麼意思呢?網址會是api/news/這邊可以隨便打,只要符合這樣的結構都會進來這一個方法中
如果還記得RESTful API的風格,會知道第三層隨便打的地方,應該要打上你想取得的那個資料的主鍵id
那之後我們該如何取得第三層的值呢?如下
[HttpGet("{id}")]
public string Get(Guid id) //就是跟上方的命名一致,就可以取到對應的數值,不過我們的主鍵類型是Guid,所以這邊會改成要取得一個Guid id
{
return "value";
}
接著我們就要開始撈出指定的資料了
[HttpGet("{id}")]
public News Get(Guid id)
{
var result = _webContext.News.Find(id);
return result;
}
但這樣顯然有個問題,就是我們應該要用上Dto,所以我們換個寫法
[HttpGet("{id}")]
public NewsDto Get(Guid id)
{
var result = (from a in _webContext.News
where a.NewsId == id
select new NewsDto
{
Title = a.Title,
Content = a.Content,
NewsId = a.NewsId,
StartDateTime = a.StartDateTime,
EndDateTime = a.EndDateTime,
Click = a.Click
}).Single(); //只會撈出一筆的意思
return result;
}
這樣執行看看能不能順利撈出一筆資料
如此就成功撈出了指定的資料,但這樣又有個小問題,當找不到指定的id時會出錯誤
問題就出在.Single()
,這樣寫是說一定會撈出一筆,所以沒撈出東西的時候,程式就會出錯
所以我們再換個寫法
[HttpGet("{id}")]
public NewsDto Get(Guid id)
{
var result = (from a in _webContext.News
where a.NewsId == id
select new NewsDto
{
Title = a.Title,
Content = a.Content,
NewsId = a.NewsId,
StartDateTime = a.StartDateTime,
EndDateTime = a.EndDateTime,
Click = a.Click
}).SingleOrDefault(); //這樣一樣撈出一筆,但撈不出來的時候就會變成null值
return result;
}
這樣就算沒撈出東西也不會出錯誤了
那基本上如果是撈指定資料的api,通常會使用.SingleOrDefault()
而.Single()
的寫法會是用在,你認為這個地方一定要撈出東西,如果沒撈出東西代表你前面的程式有問題,因此你不想再繼續執行下去
就會用.Single()
,來阻止繼續往下執行,這是一個應用的技巧,但這邊暫時用不到,算是順帶一提
範例檔:下載