LINQ是什麼?
語言整合查詢(全名:Language Integrated Query )
用途?
就如全名所代表的意思,各種不同的查詢對象,通常都會有各自的語法,但如果每種都要學,就會花很多時間,而且少用的就學的不精,也很容易忘記
因此今天發明了LINQ,只要學習一種LINQ語法,我就可以查詢各種不同的對象,大幅減少學習成本與方便性
例如:
- LINQ to Objects:使用LINQ 語法查詢Object
- LINQ to SQL:使用LINQ 語法查詢資料庫資料
- LINQ to XML:使用LINQ 語法查詢XML資料
等等還有各種的常見的查詢對象,LINQ都有其對應的支援
這可以很有效的解決,今天特定專案剛好要查詢一個很冷門的資料類型對象,此時你不用特地去學該對象的查詢語法,只需要使用LINQ就可以簡單查詢
那背後當然是LINQ會幫你轉換成對應對象的語法進行查詢
你也不會事後過了很久之後要維護,還需要重新複習該冷門資料的查詢語法
所以在C#這邊LINQ可以說是必學的一項技術
另外這邊也建議如果還在用SQL寫在程式碼中的人,趕快換成LINQ,不僅可以讓你的程式更優雅,可以偵錯,也可以有效的避免注入攻擊(這之後會示範)
當然,在某些例外情況,還是有自己寫SQL的必要,不過就通常的查詢、新增、修改、刪除用LINQ就綽綽有餘了
寫法
LINQ這邊主要有兩種不同的寫法,但得到的結果是一樣的
1.宣告式(Declarative)
學過SQL語法的人,可能會覺得有點像SQL敘述句的感覺,譬如說我今天要查一個新聞標題為"凱哥寫程式"的新聞,可以這麼寫
var result = from a in NewsList
where a.Title == "凱哥寫程式"
select a;
其實看起來可讀性相當的高,就是從NewsList中,找Title為凱哥寫程式的那一筆出來
2.編程式(Imperative):(lambda)
var result = NewsList.Where(a => a.Title == "凱哥寫程式");
看起來就比較抽象一點,不過這個範例比較簡單,所以還算看得清楚,但就觀看性而言,變得更簡潔
至於要用哪一種,其實就看個人喜好
以下就來簡單示範一下查詢、新增、修改、刪除的LINQ怎麼寫
using Microsoft.AspNetCore.Mvc;
namespace Linq使用範例.Controllers
{
[ApiController]
[Route("[controller]")]
public class NewsController : ControllerBase
{
private static readonly List<News> NewsList = new List<News>
{
new News{NewsId=1,Title="凱哥寫程式",Content="帶你輕輕鬆鬆學習程式"},
new News{NewsId=2,Title="ASP.NET Core Web API課程",Content="帶你輕輕鬆鬆學習ASP.NET Core Web API"},
new News{NewsId=3,Title="ASP.NET Core MVC課程",Content="帶你輕輕鬆鬆學習程式ASP.NET Core MVC"},
new News{NewsId=4,Title="Angular課程",Content="帶你輕輕鬆鬆學習程式Angular"}
};
//查詢全部新聞
[HttpGet]
public IEnumerable<News> Get()
{
return NewsList;
}
//查詢指定新聞
[HttpGet("{id}")]
public IEnumerable<News> Get(int id)
{
var result = from a in NewsList
where a.NewsId == id
select a;
result = NewsList.Where(a => a.NewsId == id);
return result;
}
//新增一筆新聞
[HttpPost]
public IEnumerable<News> Post(News value)
{
NewsList.Add(value);
return NewsList;
}
//修改一筆新聞
[HttpPut("{id}")]
public IEnumerable<News> Put(int id, News value)
{
var update = (from a in NewsList
where a.NewsId == id
select a).SingleOrDefault();
update = NewsList.SingleOrDefault(a => a.NewsId == id);
if (update != null)
{
update.Title = value.Title;
update.Content = value.Content;
}
return NewsList;
}
//刪除一筆新聞
[HttpDelete("{id}")]
public IEnumerable<News> Delete(int id)
{
var delete = (from a in NewsList
where a.NewsId == id
select a).SingleOrDefault();
delete = NewsList.SingleOrDefault(a => a.NewsId == id);
if (delete != null)
{
NewsList.Remove(delete);
}
return NewsList;
}
}
}
開頭先宣告一個News的陣列NewsList,並且給了四個值,後續就針對NewsList進行查詢、新增、修改、刪除
範例檔在這邊,想試試的可以下載回去自己試試看,這邊有分別寫了宣告式跟編程式的語法讓大家參考
影片會有實際每支執行的情況跟簡單講解,因為打字真的不好講解XD
範例檔:下載