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(A.NAME);                    //添加一个要选择的字段

Condition c=q1. GetQueryCondition();         //A表产生一个查询

c.AddEqualTo(“Name”,”tintown”);              //给A添加条件,请参考Condition

q1.OrderBy(“Name”);                     //添加一个排序,请参考RetrieveCriteria

Query q2=new Query(typeof(B));              //建一个B表的Query

q2.AddAttribute(B.COMPANY,”公司名”);      //添加另一个选择的字段,以别名输出

q1. AddJoinQuery(A.ID,q2,B.AID);            //把q1与q2关联起来

DataTable dt=q1. Execute();                 //执行查询

步骤分析:

1. Query的创建与Criteira差不多一样的,要指定一个实体类型typeof(A)

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

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

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

3.      AddAttribute(AttributeType.All):这是指以*号的方式全部显示

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

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

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

其他的Condition与OrderBy都与RetrieveCriteria类似,不再赘述。

统计查询

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

Query q1=new Query(typeof(A));

q1.AddAttribute(A.NAME):                 //显示NAME

q1.SelectMax(A.PRICE,”MAXPRICE”);             //统计最高价格,别名MAXPRICE

q1.SelectSum(A.PRICE,”ALLPRICE”);              //统计价格总和,别名ALLPRICE

q1.SelectAvg(A.PRICE,”AVGPRICE”);             //统计平均价格,别名AVGPRICE

q1.SelectCount(A.NAME,”COUNT”);               //统计条数,别名COUNT

q1.GroupBy(A.NAME);                           //接NAME进行分组

q1. Execute();                                 //执行

使用SelectMax,SelectSum,SelectAvg,SelectCount进行简单的汇总,上面的例子是显示多汇总值的情况,所以是采用Execute()方法.

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

Query q=newQuery(typeof(A);

q.SelectCount(A.ID);

intre=q. ExecuteScalar();

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

SQL语句执行

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

string sqlString=”select name from A whereprice>1000”;

Query. ProcessSql(sqlString,”dbName”);

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

DISTINCT功能

在SPL中可以使用IsDistinct属性来使用DISTINCT功能,这将最终生成”Select distinct…”的语句。

存储过程

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

IDataParameterpara=Query.GetParameter("northwind"); //创建一个参数

para.ParameterName="@name1";  //定义参数名

para.Value="f";              //定义参数值

IDataParameter[] paras=new IDataParameter[1];  //定义参数数组

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

DataTabledt=Query.RunProcedure("test",paras,"northwind"); //执行存储过程

[置顶] SPL讲解(7)--Query高级篇的更多相关文章

  1. [置顶] SPL讲解(4)--Criteria操作篇

    概念 以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的.如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和De ...

  2. [置顶] SPL讲解(6)--Condition篇

    SmartPersistenceLayer 2.0 之 Condition篇 原理        强大的Condition功能是SPL的一个特性,可以使用Condition完成绝大部分的条件定义,使用 ...

  3. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  4. SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解

    1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...

  5. [知了堂学习笔记]_css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

  6. css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

  7. PHP笔记(PHP高级篇)

    高级篇中将涉及数据库的使用以及Cookie和Session会话,提高PHP的开发效率和运行效率 PHP程序员需要掌握的MySQL操作 为项目设计表 使用SQL语句 MySQL的目录结构 data目录中 ...

  8. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  9. Vue2和Vue3技术整理3 - 高级篇

    3.高级篇 前言 基础篇链接:https://www.cnblogs.com/xiegongzi/p/15782921.html 组件化开发篇链接:https://www.cnblogs.com/xi ...

随机推荐

  1. vi命令笔记

    vim编辑器 文本编辑器,字处理器ASCII nano, sed vi: Visual Interfacevim: VI iMproved 全屏编辑器,模式化编辑器 vim模式:编辑模式(命令模式)输 ...

  2. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

  3. (转)Apache+Tomcat集群配置

    本文Apache+Tomcat集群配置 基于最新的Apache和Tomcat,具体是2011年4月20日最新的Tomcat和Apache集群和负载均衡配置. 准备环境 Apache Apache是ht ...

  4. 动态SQL的执行,注:exec sp_executesql 其实可以实现参数查询和输出参数的

    本文转自:http://www.cnblogs.com/hnsdwhl/archive/2011/07/23/2114730.html 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态 ...

  5. 动态载入TreeView时让TreeView节点前显示加号

    解释下标题,我这里通过webservice获取数据并动态载入TreeView节点.那么某个节点展开前它是没有子节点的.那么它就不显示加号.这样会让用户误以为此节点不能展开.我是这样做的,每次创建节点a ...

  6. NuGet学习笔记(2)——使用图形化界面打包自己的类库(转)

    上文NuGet学习笔记(1) 初识NuGet及快速安装使用说到NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新.在安装好NuGet扩展后,我们已经能够通 ...

  7. C++菱形继承的构造函数

    网上搜了很多,大多是关于菱形虚继承的构造函数应该怎么写,或者就是最简单的,四个类都不带参数的构造函数. 本文旨在记录一下困扰了博主1h的问题,非常浅显,有帮助固然好,如果侮辱谁的智商还见谅,当然无限欢 ...

  8. js控制html5 audio的暂停、播放、停止

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name ...

  9. CSS3旋转图片效果收集

    火狐中文网图片效果: [http://i.firefoxchina.cn/?www.firefoxchina.cn] .news-img-wrapper:hover img {     transfo ...

  10. Android-现场保护

    现场保护 当一个活动进入到了停止的状态,是有可能被系统回收的,我们都学过Activity的生命周期 当活动处于onPause() ,onStop() ,onDestroy() 三种状态时程序可能会被A ...