0%

[DotnetCore]ORM系列-SqlSugar:查詢篇1

前提情要

昨日介紹完SqlSugar後,是否被他的簡單易用吸引了呢,筆者今天就介紹它的查詢實作,就會漸漸發現其功能之強大,今天就照https://www.donet5.com/Home/Doc?typeId=1187操作一遍吧。

內容

查詢部份的可以使用的操作多到爆炸,這篇就以挑幾則查詢做示範,會將查詢分門別類,大概會分成數篇來做一一介紹。以Queryable開頭,使用泛型方式將欲查詢的Model傳入,接著使用Where關鍵字作過濾條件作業,ORM框架該有的皆有,讓我有一種感覺是EFCoreDapper的綜合體,且是擷取兩邊的優點而設計。

基礎查詢

基礎查詢不外乎就是將條件過濾串接,分為主鍵查詢、單、多條件過濾查詢,也有些情境是會使用到OR將多個條件串接,通通都有支援。

根據主鍵查詢

筆者這邊使用Customer表,該表的主鍵為CustomerName,因此使用CustomerName當作Route參數一部份,傳進Action中過濾

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 依照主鍵取得資料
/// </summary>
/// <param name="customerNumber"></param>
/// <returns></returns>
[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
/// <summary>
/// 單條件過濾
/// </summary>
/// <param name="conditions"></param>
/// <returns></returns>
[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物件,筆者這節會使用CustomerNameCountry欄位當作多條件過濾使用欄位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
/// 多條件查詢
/// </summary>
/// <param name="conditions"></param>
/// <returns></returns>
[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
/// <summary>
/// Or查詢
/// </summary>
/// <param name="conditions"></param>
/// <returns></returns>
[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關鍵字做取得,其實已經於主鍵查詢時已實作過,基本上跟LinqFirstOrDefault相同,沒有資料則會回傳null,筆者就不再特別示範

前幾筆紀錄

筆者這邊將PageSize當作Route的一部份,完成撈取前幾筆紀錄的查詢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/// <summary>
/// 取得前幾筆資料
/// </summary>
/// <param name="pageSize"></param>
/// <returns></returns>
[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框架中的一大利器啊。

參考