前情提要
昨日介紹完SqlSugar
後,是否被他的簡單易用吸引了呢,筆者今天就介紹它的查詢實作,就會漸漸發現其功能之強大,今天就照https://www.donet5.com/Home/Doc?typeId=1187操作一遍吧。
內容
查詢部份的可以使用的操作多到爆炸,這篇就以挑幾則查詢做示範,會將查詢分門別類,大概會分成數篇來做一一介紹。以Queryable
開頭,使用泛型方式將欲查詢的Model
傳入,接著使用Where
關鍵字作過濾條件作業,ORM
框架該有的皆有,讓我有一種感覺是EFCore
跟Dapper
的綜合體,且是擷取兩邊的優點而設計。
基礎查詢
基礎查詢不外乎就是將條件過濾串接,分為主鍵查詢、單、多條件過濾查詢,也有些情境是會使用到OR
將多個條件串接,通通都有支援。
根據主鍵查詢
筆者這邊使用Customer
表,該表的主鍵為CustomerName
,因此使用CustomerName
當作Route參數一部份,傳進Action中過濾
1 2 3 4 5 6 7 8 9 10 11
|
[ProducesResponseType(typeof(Customers), StatusCodes.Status200OK)] [HttpPost("{customerNumber}")] public IActionResult GetCustomerById(int customerNumber) { return Ok(_db.Queryable<Customers>().First(x => x.CustomerNumber == customerNumber)); }
|
單條件查詢
筆者這邊設計一個Conditions
物件,為條件過濾做準備
1 2 3 4 5 6
| public class CustomerConditions { public string CustomerName { get; set; } public string CountryName { get; set; } public List<string> StateList { get; set; } }
|
接著為示範單條件過濾,筆者這邊使用CustomerName
欄位當作主要單條件過濾的欄位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
[ProducesResponseType(typeof(List<Customers>), StatusCodes.Status200OK)] [HttpPost("where")] public IActionResult GetCustomerByConditions(CustomerConditions conditions) { var result = _db.Queryable<Customers>() .Where(x => x.CustomerName.Contains(conditions.CustomerName)) .Select<Customers>() .ToList(); return Ok(result); }
|
多條件查詢
接著筆者這邊使用上節提到的Conditions
物件,筆者這節會使用CustomerName
、Country
欄位當作多條件過濾使用欄位
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
[ProducesResponseType(typeof(List<Customers>), StatusCodes.Status200OK)] [HttpPost("wheremultiple")] public IActionResult GetCustomersByMultipleConditions(CustomerConditions conditions) { var result = _db.Queryable<Customers>() .Where(x => x.CustomerName.Contains(conditions.CustomerName) && x.Country.Contains(conditions.CountryName)) .ToList(); return Ok(result); }
|
動態OR查詢
一定會遇到查詢情境是,某個欄位條件符合A或B,這個時後可以使用SqlSugar
提供的Expression
來達到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
[ProducesResponseType(typeof(List<Customers>), StatusCodes.Status200OK)] [HttpPost("or")] public IActionResult GetCustomersByOrConditions(CustomerConditions conditions) { var expressions = Expressionable.Create<Customers>(); foreach (var state in conditions.StateList) { expressions.Or(x => x.State == state); } var result = _db.Queryable<Customers>() .Where(expressions.ToExpression()) .ToList(); return Ok(result); }
|
Top查詢
取得第一筆
使用First
關鍵字做取得,其實已經於主鍵查詢
時已實作過,基本上跟Linq
的FirstOrDefault
相同,沒有資料則會回傳null
,筆者就不再特別示範
前幾筆紀錄
筆者這邊將PageSize
當作Route
的一部份,完成撈取前幾筆紀錄的查詢
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
[ProducesResponseType(typeof(List<Customers>), StatusCodes.Status200OK)] [HttpPost("take/{pageSize}")] public IActionResult GetCustomersByTake(int pageSize) { var result = _db.Queryable<Customers>() .Take(pageSize) .ToList(); return Ok(result); }
|
結論
筆者這邊Demo Project寫下來的感覺是,若會使用LinqToSql
的人,毫無違和感,要熟悉一下關鍵字,進到Where
條件的Expression輸入區塊時,完全熟悉起來,強型別就是棒啊,簡單查詢完全不想用純String
的sql宣告查詢,且不用像EFCore
大砲那樣顧前顧後,若操作不好,擦槍走火的事件發生,基本上就是把你宣告的Expression單純轉換成Sql後往資料庫查詢,將查詢結果已幫你Binding至對應的Model中,完全是ORM框架中的一大利器啊。
參考