Query 對象

對于(yú)簡單的(de)查詢,我們可以(yǐ)直接傳遞 Id 字段或者 Guid 字段的(de)值獲取數據,不(bù)過對于(yú)複雜查詢我們通常需要(yào / yāo)構建 Query 對象,設置條件及排序等規則進行查詢。

Query 對象可以(yǐ)作爲(wéi / wèi)參數傳遞給 Repository 數據倉庫的(de) GetAsync、GetAllAsync 以(yǐ)及 ExistsAsync方法。

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

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

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

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

Where 篩選

Datory 提供了(le/liǎo)許多有用的(de)方法來(lái)使編寫 Where 條件變得容易。

所有 Where 方法都帶有 NOT 和(hé / huò) OR 運算符的(de)重載,可以(yǐ)使用 OrWhereNull 來(lái)應用布爾 OR 運算符和(hé / huò) WhereNotNull 或 OrWhereNotNull 來(lái)否定條件。

Where 方法第一(yī / yì /yí)個(gè)參數是(shì)字段名,第二個(gè)參數是(shì)可選的(de),默認爲(wéi / wèi) = 操作。

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

我們可以(yǐ)采用鏈式操作組合多個(gè) Where 條件,條件之(zhī)間是(shì) AND 關系:

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

我們可以(yǐ)通過 NOT 和(hé / huò) OR 運算符實現非及或操作:

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

要(yào / yāo)将條件分組,隻需将它們包裝在(zài)另一(yī / yì /yí)個(gè) Where 塊中。

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

系統将解析爲(wéi / wèi)以(yǐ)下 SQL 查詢條件:

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

Order 排序

可以(yǐ)使用 OrderBy 以(yǐ)及 OrderByDesc 對數據列表進行排序,例如:

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

系統将解析爲(wéi / wèi)以(yǐ)下 SQL 排序:

ORDER BY CreatedDate, Name DESC
1

數目限制

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

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

以(yǐ)上(shàng)代碼将返回前10條數據。

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

以(yǐ)上(shàng)代碼将跳過前10條數據并返回後20條數據。

除了(le/liǎo)通過 Limit 以(yǐ)及 Offset 限制數量,我們也(yě)可以(yǐ)使用 ForPage 方法快速對數據進行分頁:

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

參數 page 代表獲取第幾頁, pageSize 代表一(yī / yì /yí)頁返回多少行,如果不(bù)傳 pageSize 參數,默認将返回15行每頁,可以(yǐ)通過将整數作爲(wéi / wèi)第二個(gè)參數傳遞來(lái)覆蓋此值。

字符串操作

Query 查詢提供 WhereStarts,WhereEnds,WhereContains 和(hé / huò) WhereLike 方法來(lái)處理類似類型的(de)字符串。

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

以(yǐ)上(shàng)代碼将查詢所有标題包含 中國(guó) 的(de)數據,和(hé / huò) SQL LIKE 語句一(yī / yì /yí)樣,我們使用 WhereLike 方法時(shí),必須手動添加通配符 %。

日期操作

Query 查詢提供 WhereDate,WhereTime 和(hé / huò) WhereDatePart 方法來(lái)處理日期列。

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

以(yǐ)上(shàng)代碼将查詢日期時(shí)間列的(de)日期部分。