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);
}
2
3
4
5
6
7
8
9
或者也可以直接設置條件快速創建 Query 對(duì)象,例如:
var query = Q.Where(Title, "标題");
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);
2
3
我們可以采用鏈式操作組合多個 Where 條件,條件之間是 AND 關系:
var query = Q.Where("Score", ">", 10).WhereDate("LastActivityDate", ">=", dateTime);
我們可以通過(guò) NOT 和 OR 運算符實現非及或操作:
var query = Q.WhereNot(GroupId, groupId).OrWhere("Title", "标題");
要將(jiāng)條件分組,隻需將(jiāng)它們包裝在另一個 Where 塊中。
var query = Q.Where("Title", "标題").Where(q =>
q.Where("Taxis" ">", 0).OrWhere("Count", 0)
);
2
3
系統將(jiāng)解析爲以下 SQL 查詢條件:
WHERE Title = '标題' AND (Taxis > 0 OR Count = 0)
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);
2
3
系統將(jiāng)解析爲以下 SQL 排序:
ORDER BY CreatedDate, Name DESC
數目限制
可以使用 Limit 以及 Offset 限制從數據庫返回的結果數量。
var query = Q.OrderByDesc("Id").Limit(10);
以上代碼將(jiāng)返回前10條數據。
var query = Q.OrderByDesc("Id").Offset(10).Limit(20);
以上代碼將(jiāng)跳過(guò)前10條數據并返回後(hòu)20條數據。
除了通過(guò) Limit 以及 Offset 限制數量,我們也可以使用 ForPage 方法快速對(duì)數據進(jìn)行分頁:
var query = Q.OrderByDesc("Id").ForPage(page, pageSize);
參數 page 代表獲取第幾頁, pageSize 代表一頁返回多少行,如果不傳 pageSize 參數,默認將(jiāng)返回15行每頁,可以通過(guò)將(jiāng)整數作爲第二個參數傳遞來覆蓋此值。
字符串操作
Query 查詢提供 WhereStarts,WhereEnds,WhereContains 和 WhereLike 方法來處理類似類型的字符串。
var query = Q.WhereLike("Title", "%中國(guó)%");
以上代碼將(jiāng)查詢所有标題包含 中國(guó) 的數據,和 SQL LIKE 語句一樣(yàng),我們使用 WhereLike 方法時(shí),必須手動添加通配符 %。
日期操作
Query 查詢提供 WhereDate,WhereTime 和 WhereDatePart 方法來處理日期列。
var query = Q.WhereDate("CreatedDate", "2021-01-01");
以上代碼將(jiāng)查詢日期時(shí)間列的日期部分。