這篇就要開始講如何從資料庫讀取資料,接著會有一系列的讀取資料的做法,首先我們就先從最基本的開始講起。
我們要撈出News資料表中所有資料其實之前在設定資料庫的時候就有示範過了
[HttpGet]
public IEnumerable<News> Get()
{
return _webContext.News;
}
非常簡單就可以讀取News資料表中所有的資料了
但這樣可能會有一個小問題,就是實務上我們可能並不想把所有欄位都撈出來,我只想給別人看特定的資料,其他是我內部紀錄或其他用途的資料
並不想給別人看到,這個時候該怎麼做呢?
以這個例子為例,我可能不想讓人知道我的InsertDateTime、UpdateDateTime和Enbale,因為這是我內部資料,沒必要撈出來給別人看
也不需要浪費流量撈這些資料出來,所以可以有以下寫法
[HttpGet]
public IEnumerable<object> Get()
{
var result = from a in _webContext.News
select new
{
a.NewsId,
a.Title,
a.Content,
a.StartDateTime,
a.EndDateTime,
a.Click
};
return result;
}
這樣,我們只寫上我們要呈現的欄位名稱,如此這支API就會如下圖
但這樣會有一個小問題,就是缺乏了可讀性和維護性,什麼意思?
簡單來說就是我們沒有去定義一個明確的型別,這會大幅降低日後的可維護性
如果有很多地方都用到,那不清楚定義一個型別,那更是需要,雖然會增加一開始的工作量,但定義型別絕對是必要的
因此我們可以增加一個NewsDto類別,我們這邊建立一個Dtos資料夾,專門來放Dto
接著在NewsDto中,定義出上我們需要撈出來的欄位
namespace WebAPI.Dtos
{
public class NewsDto
{
public Guid NewsId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime StartDateTime { get; set; }
public DateTime EndDateTime { get; set; }
public int Click { get; set; }
}
}
那Dto是什麼呢?中文是建立資料傳輸物件
簡單來說,就是為了達成上面那個目的,所特別建立出來的物件,我們就可以為他結尾取名為Dto
用這個名稱的好處是,是一個習慣的用法,之後其他人看你的專案,也能夠直接了解這個類別的作用是什麼
這跟其他各種結尾命名的用法是一樣的,如我們一開始看到的Controller結尾命名法,就只是想讓人一眼,就可以先知道這個類別的用處是什麼
並不會因為這樣命名,有了什麼特殊功能喔~~~
所以原來的API程式我們可以這樣改寫
[HttpGet]
public IEnumerable<NewsDto> Get()
{
var result = from a in _webContext.News
select new NewsDto
{
NewsId = a.NewsId,
Title = a.Title,
Content = a.Content,
StartDateTime = a.StartDateTime,
EndDateTime = a.EndDateTime,
Click = a.Click
};
return result;
}
那當然,這個執行結果會跟之前的是一樣的,但整體的可讀性跟維護性則會大大提高
新手一開始或許還很難感受到好處,甚至可能覺得有點麻煩,但等你專案漸漸大了之後,就會有所體驗
所以現在還沒辦法理解沒關係,但這絕對是實務上必要的做法之一,用就對了
之後會陸續教到越來越多麻煩的做法,都是為了增加可讀性跟維護性
但並不是全部都必須套用,而是視情況使用,這我之後會在著重講解給大家聽
不過今天這個,我認為是90%情況都必須要套用的,剩下10%大概是那種亂寫交差了事就可以的那種XD
範例檔:下載
參考資料: