Xqk.Data數據框架開發指南:豐富的、靈活的查詢方法(第二部分:適應不一樣數據庫系統的查詢)

在上篇文章《豐富的、靈活的查詢方法(第一部分)》提到,針對不一樣的開發任務,Xqk.Data數據框架提供了豐富的、靈活的查詢方法,文章還介紹了一些查詢方法,在這些方法中,大部分都有一個共同的whereStr參數,該參數用來代表查詢條件,即SQL語句中緊跟WHERE關鍵字的部分。須要注意的是,不一樣的數據庫系統都有一些特定的行爲。所以,若是代碼要想適應不一樣的數據庫系統,請確保提供的whereStr能在不一樣數據庫系統下都能正確執行,且可以獲得相同的結果或行爲,或者爲不一樣的數據庫系統提供不一樣的whereStr值。數據庫

DbTable<TEntity>類爲每一個使用whereStr查詢方法提供了相應的SqlExpression類型whereExpr參數的重載方法。 如:c#

public TEntity[] Select(SqlExpression whereExpr); 
public TEntity SelectSingle(SqlExpression whereExpr); 
public T SelectValue<T>(string fieldname, SqlExpression whereExpr); 
public T[] SelectFieldValues<T>(string field, SqlExpression whereExpr);

Xqk.Data框架的SqlExpression類被設計成能適應不一樣的數據庫系統。使用SqlExpression參數能確保代碼能在不一樣數據庫系統下都能正確執行,且可以獲得相同的結果或行爲。框架

SqlExpression,即SQL表達式。包含3個屬性:Operate,Left,Right,對應於SQL表達式的操做符,左操做數和右操做數。
Operate 表示操做符,其類型爲SqlExpressionOperate枚舉,定義以下:ide

public enum SqlExpressionOperate
{
    And, Or, Not, 
    Equal, Greater, Lower, NotEqual, NotGreater, NotLower, 
    Comma, Text, 
    StartsWith
}

Left表示左操做數,其類型爲string,通常是數據列的名稱。
Right表示右操做數,其類型爲object,通常須要根據操做符來判斷。函數

雖然SqlExpression提供了公共構造函數,但不建議用構造函數來生成SqlExpression實例,而應該使用Xqk.Data數據框架提供的一整套與SQL表達式操做符相對應的靜態函數。例如,在第一個例子中,咱們可使用如下的一些查詢表達式:ui

  • _DbtPerson.Select("ismale=1") //查詢全部性別爲男性的人
    _DbtPerson.Select( SqlExpression.Equal("ismale",1))
  • _DbtPerson.Select("height>103 and ismale=0") //查詢全部身高超過103的女性
    _DbtPerson.Select( SqlExpression.And(
    SqlExpression.Greater("height",103),
    SqlExpression.Equal("ismale",0)
    ));

看上去,使用SqlExpression比使用string要複雜,可是不要忘了,使用SqlExpression的一個主要目的是爲適應不一樣的數據庫系統。下面就以StartsWith表達式爲例來講明這個重要的特色。設計

爲了查詢數據表中姓「張」的人,在MySQL中咱們能夠用
            instr(`name`,"張")=1; 或 substr(`name`,1,1)="張"
而在SQLite下只能用
            substr(`name`,1,1)="張"
在Sql Server中要用
            substring(`name`,1,1)="張" 或 charindex("張",name)=1;
因此必須爲不一樣的數據庫系統提供不一樣的whereStr,而使用SqlExpression,則用
            SqlExpression.StartsWith("name", "張")
就能夠在不一樣數據庫系統中實現查詢name列以張開頭的記錄。code

相關文章
相關標籤/搜索