SPL讲解 7Query高级篇

发布 2020-01-02 13:06:28 阅读 3691

smartpersistencelayer 2.0 之query高级查询篇。

总述。在看了前面的功能后,大家都会考虑到多表之间的查询怎么办.在这里,我想先讲一下查询在应用系统中的复杂性/重要性/可行性.

重要性:查询统计是系统维护的一个目标之一,是系统的一个必不可少的部分,因此,在绝大部分的系统中,都会有查询统计。

复杂性:查询是在系统开发中一个最复杂的部分,谁都无法预料查询统计的复杂性,哪怕是在一个小型系统中,因此,在spl中也是无法实现这么多的查询统计,为了兼容,spl也努力实现了它所能做的,就是”联合查询”功能,将通过query类来完成.

可行性:要能快速,有效的应付复杂多变的查询与统计,在我看来,用视图进行处理是一个最有效的方式.一是视图的高速:数据库的视图查询要比执行sql来的快多,因为数据库会为视图进行缓存.二是开发快速性:

写sql语句需要很多时间,而且查询汇总的语句都是相当复杂的,所以也容易出错,而视图会把问题变的非常简单,开发速度大大提高.三是维护性:由于查询的复杂性,变动频繁将是最明显的特征,所以sql语句的应变能力没有视图来得好.

因此,我的建议是对于一些查询与统计,我们应尽可能的采用视图来做.简单的查询当然可以使用sql.现在来介绍spl中的query联合查询.

联合查询。例子:a表的id与b表的aid有关联,我们要关联a/b表,选择a表的name和b表的company值.

query q1=new query(typeof(a建一个a表的query

q1. addattribute(添加一个要选择的字段。

condition c=q1. getqueryconditiona表产生一个查询。

给a添加条件,请参考condition

添加一个排序,请参考retrievecriteria

query q2=new query(typeof(b建一个b表的query

公司名添加另一个选择的字段,以别名输出。

q1. addjoinquery(把q1与q2关联起来。

datatable dt=q1. execute执行查询。

步骤分析:1. query的创建与criteira差不多一样的,要指定一个实体类型typeof(a)

2. 由于是多表查询,所以要求设定选择哪些字段,目前spl中有三种方式:

1. addattribute(字段名):这是直接以字段名为输出名。

2. addattribute(字段名,别名):这是可以把字段名以别名的方式输出。

3. addattribute(这是指以*号的方式全部显示。

3. 使用execute()执行后返回datatable类型,可以直接绑定用。

在使用这种输出字段时,要注意不能重名输出,尤其是在使用了*号后,因为会正在一些不可**的字段重名,所以,建议尽可能使用别名。

通过以上的方式就可以实现大多数表之间的联合查询。以上有个局限性:表写表之间的关系都是inner join的。也就是无法实现左连接效果,对于这种查询,我还是建议使用视图。

其他的condition与orderby都与retrievecriteria类似,不再赘述。

对于汇总查询本身也是非常复杂的,spl也只能实现简单的汇总,对于复杂性的汇总还是建议使用视图或是sql进行。

query q1=new query(typeof(a));

显示name

统计最**格,别名maxprice

统计**总和,别名allprice

统计平均**,别名**gprice

统计条数,别名count

接name进行分组。

q1. execute执行。

使用selectmax,selectsum,select**g,selectcount进行简单的汇总,上面的例子是显示多汇总值的情况,所以是采用execute()方法。

spl还提供了单返回的方式:

query q=new query(typeof(a);

int re=q. executescalar();

这可以返回条数,其实在spl中就是获取第一条记录的第一列值。

为了扩展兼容性,还是要提供最基本的sql语句执行接口,对于一些复杂的语句,可以使用sql语句的执行来解决,实现的方式也是非常简单:

string sqlstring=”select name from a where price>1000”;

query. processsql(sqlstring,”dbname”);

这里的dbname 是指语句针对哪个数据源进行操作,当然要注意的,通过sql执行返回的字段名,是数据库的实际的字段名了,而不是实体的属性名了。

在spl中可以使用isdistinct属性来使用distinct功能,这将最终生成”select distinct…”的语句。

spl中也同样支持存储过程,我们也可以通过query的静态类完成:

idataparameter para="northwind");创建一个参数。

"@name1"; 定义参数名。

"f定义参数值。

idataparameter paras=new idataparameter[1]; 定义参数数组。

paras[0]=para给数组赋个参数。

datatable dt="test",paras,"northwind");执行存储过程。

7 12阅读讲解unit

2012.7补课阅读试卷笔记。单选 call up使想起 call on 号召 call for 要求 call in 召集。in particular 尤其,特别是 come up with 提出 意见,建议等 如何处理 how to deal with what to do with give ...

牛津英语7AUnit6单元讲解和练习

牛津英语7a unit6单元讲解和课后练习。1.it s 形容词 for sb.to do sth.it s easy for you to carry this box.it s important to be healthy.2.borrow sth from sb.lend sth to sb...

牛津英语广州版7AUnitone讲解与练习

牛津英语广州版7a unit 1 friends 难点精讲 reading part would like to be your penfriend.我想成为你的笔友。would like 想,想要 后常接名词和不定式,可以与want互相转换。如 would you like some tea?do...