Query 對(duì)象

對(duì)于簡單的查詢,我們可以直接傳遞 Id 字段或者 Guid 字段的值獲取數據,不過(guò)對(duì)于複雜查詢我們通常需要構建 Query 對(duì)象,設置條件及排序等規則進(jìn)行查詢。

Query 對(duì)象可以作爲參數傳遞給 Repository 數據倉庫的 GetAsync、GetAllAsync 以及 ExistsAsync方法。

我們可以使用靜态類 Q 快速創建 Query 對(duì)象,例如:

var query = Q.NewQuery();
if (!string.IsNullOrEmpty(keyword))
{
    query.WhereLike(`Title`, $"%{keyword}%");
}
if (!string.IsNullOrEmpty(order))
{
    query.OrderByDesc(order);
}
1
2
3
4
5
6
7
8
9

或者也可以直接設置條件快速創建 Query 對(duì)象,例如:

var query = Q.Where(Title, "标題");
1

Where 篩選

Datory 提供了許多有用的方法來使編寫 Where 條件變得容易。

所有 Where 方法都(dōu)帶有 NOT 和 OR 運算符的重載,可以使用 OrWhereNull 來應用布爾 OR 運算符和 WhereNotNull 或 OrWhereNotNull 來否定條件。

Where 方法第一個參數是字段名,第二個參數是可選的,默認爲 = 操作。

var query = Q.Where("Id", 10);
// 等同于
var query = Q.Where("Id", "=", 10);
1
2
3

我們可以采用鏈式操作組合多個 Where 條件,條件之間是 AND 關系:

var query = Q.Where("Score", ">", 10).WhereDate("LastActivityDate", ">=", dateTime);
1

我們可以通過(guò) NOT 和 OR 運算符實現非及或操作:

var query = Q.WhereNot(GroupId, groupId).OrWhere("Title", "标題");
1

要將(jiāng)條件分組,隻需將(jiāng)它們包裝在另一個 Where 塊中。

var query = Q.Where("Title", "标題").Where(q =>
    q.Where("Taxis" ">", 0).OrWhere("Count", 0)
);
1
2
3

系統將(jiāng)解析爲以下 SQL 查詢條件:

WHERE Title = '标題' AND (Taxis > 0 OR Count = 0)
1

Order 排序

可以使用 OrderBy 以及 OrderByDesc 對(duì)數據列表進(jìn)行排序,例如:

var repository = new Repository<DataModel>(settingsManager.Database, settingsManager.Redis);
var query = Q.OrderBy("CreatedDate").OrderByDesc("Name");
var list = await repository.GetAllAsync(query);
1
2
3

系統將(jiāng)解析爲以下 SQL 排序:

ORDER BY CreatedDate, Name DESC
1

數目限制

可以使用 Limit 以及 Offset 限制從數據庫返回的結果數量。

var query = Q.OrderByDesc("Id").Limit(10);
1

以上代碼將(jiāng)返回前10條數據。

var query = Q.OrderByDesc("Id").Offset(10).Limit(20);
1

以上代碼將(jiāng)跳過(guò)前10條數據并返回後(hòu)20條數據。

除了通過(guò) Limit 以及 Offset 限制數量,我們也可以使用 ForPage 方法快速對(duì)數據進(jìn)行分頁:

var query = Q.OrderByDesc("Id").ForPage(page, pageSize);
1

參數 page 代表獲取第幾頁, pageSize 代表一頁返回多少行,如果不傳 pageSize 參數,默認將(jiāng)返回15行每頁,可以通過(guò)將(jiāng)整數作爲第二個參數傳遞來覆蓋此值。

字符串操作

Query 查詢提供 WhereStarts,WhereEnds,WhereContains 和 WhereLike 方法來處理類似類型的字符串。

var query = Q.WhereLike("Title", "%中國(guó)%");
1

以上代碼將(jiāng)查詢所有标題包含 中國(guó) 的數據,和 SQL LIKE 語句一樣,我們使用 WhereLike 方法時(shí),必須手動添加通配符 %。

日期操作

Query 查詢提供 WhereDate,WhereTime 和 WhereDatePart 方法來處理日期列。

var query = Q.WhereDate("CreatedDate", "2021-01-01");
1

以上代碼將(jiāng)查詢日期時(shí)間列的日期部分。