Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第二部分:适应不同数据库系统的查询)

在上篇文章《丰富的、灵活的查询方法(第一部分)》提到,针对不同的开发任务,Xqk.Data数据框架提供了丰富的、灵活的查询方法,文章还介绍了一些查询方法,在这些方法中,大部分都有一个共同的whereStr参数,该参数用来表明查询条件,即SQL语句中紧跟WHERE关键字的部分。需要注意的是,不同的数据库系统都有一些特定的行为。因此,如果代码要想适应不同的数据库系统,请确保提供的whereStr能在不同数据库系统下都能正确执行,且能够得到相同的结果或行为,或者为不同的数据库系统提供不同的whereStr值。

DbTable<TEntity>类为每个使用whereStr查询方法提供了相应的SqlExpression类型whereExpr参数的重载方法。 如:

  • 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枚举,定义如下:
public enum SqlExpressionOperate
{
And, Or, Not,
Equal, Greater, Lower, NotEqual, NotGreater, NotLower,
Comma, Text,
StartsWith
}

Left表示左操作数,其类型为string,一般是数据列的名称。
Right表示右操作数,其类型为object,一般需要根据操作符来判断。

虽然SqlExpression提供了公共构造函数,但不建议用构造函数来生成SqlExpression实例,而应该使用Xqk.Data数据框架提供的一整套与SQL表达式操作符相对应的静态函数。例如,在第一个例子中,我们可以使用以下的一些查询表达式:

  • _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列以张开头的记录。

posted on 2011-11-06 07:13  zjxing  阅读(216)  评论(3编辑  收藏  举报