(PDF.NET框架实例讲解)将任意复杂的SQL查询映射成实体类
通常情况下我们的ORM框架都是将单表或者视图映射成一个实体类,有时候也会将存储过程映射成实体类,如果处于系统移植性的考虑,你不想写存储过程,那这些复杂的SQL查询怎么映射成实体类?
实际上,不管是单表,视图,存储过程,SQLSERVER的表值函数,自定义的SQL查询,甚至是任意复杂的SQL查询,都可以用一个SQL语句来表示,只要我们的ORM框架能够实现将SQL语句的查询结果映射成实体类,那么使用ORM就很简单了。我们使用PDF.NET(PWMIS数据开发框架)来实例讲解一下这个过程。
1,首先下载并安装一个“PDF.NET集成开发环境”,详细内容请参见《PDF.NET数据开发框架之集成开发工具Ver 4.1发布》,下面是该工具运行的界面:
2,在“数据连接”选项卡上,选择或创建一个连接分组,然后再添加一个连接(注意鼠标右键菜单),之后就能够打开该连接,看到该连接下面的数据库、表、视图、存储过程等内容,如上图所示。工具支持各种类型的数据库。
3,新建一个查询,在上图右边的内容区输入你的SQL语句,按“F5”键,如果正确将会看到结果网格。
到此为止,你可以使用本工具作为一个支持多种数据库的“查询分析器”来使用了,你还可以扩展它的数据提供程序,以支持你自己的数据源。
4,在“查询窗口”,鼠标右键的弹出菜单上,选择“生成实体类”
然后,弹出一个新窗口,进行生成实体类的有关设置:
注意勾选“SQL查询的有效性”,并输入要映射的实体类名称等信息,然后点击“确定”。
在“属性浏览器”里面,进行一些生成的设置,主要有文件路径和代码语言的选择,设置好以后,可以单击网格上面的“预览”连接,弹出如下界面:
这个时候可以看到我们生成的实体类的原貌,如果觉得不好,可以修改重新进行。
关闭窗口后,如果还想添加更多的自定义查询,请单击“高级”按钮,将重复上面的步骤,添加一个新的查询,结果如下图:
单击“生成”按钮,将生成两个选中的实体类文件。
注意:这里除了生成的实体类文件之外,还会生成一个固定名称的实体类配置文件 EntitySqlMap.config文件,下面将会讲到它的用处。
5,经过上面的步骤,我们的实体类文件生成好了,下面做一些准备工作,看看如何在项目里面使用。
先打开自定义查询的实体类配置文件 EntitySqlMap.config文件,我们做一下修改:
修改该文件的内容,将原来有实际基金代码的地方,都替换成 @jjdm 的SQL查询参数名称,如上图。
接下来,将这3个文件添加到我们的Model项目中:
接下来,将EntitySqlMap.config文件作为嵌入式资源文件编译,注意如果你做的是WinForm 程序,可以跳过这一步,但程序运行时需要包含该文件,所以还是建议作为嵌入式文件编译,这样有更好的安全性。另外该文件应该和实体类文件放到同一个目录下面。
最后,我们看看如何在项目里面使用这样的实体类:
自定义查询的实体类跟普通的PDF.NET实体类使用方式类似,都需要OQL表达式来操作,例如选取要使用的字段,设置Where条件,这里为了简便,仅仅调用了OQL.Select()方法,选取查询出来的全部列。
注意:自定义查询的实体类如果你的SQL查询语句需要使用参数,例如本地的 @jjdm,则还应该设置OQL的InitParameters属性,如上图所示。
最后,将可以直接查询了,用过PDF.NET框架的朋友都知道,就一行代码,如本例所示:
List<JJDangAnInfo> list = EntityQuery<JJDangAnInfo>.QueryList(q);
6,经过以上步骤,我们的代码已经可以运行了。当前的实例用到了一个ASP.NET+MVC 2.0的项目中,下面是运行的效果图:
PDF.NET自定义查询实体类的实例运用,还可以参考
SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。
除了可以通过本文说的方式将SQL语句映射到实体类,还可以通过PDF.NET内置的SQL-MAP技术来实现实体类映射,就像iBaits那样,但比iBaits简单很多,详细内容,请参看:
注:本文所说的自定义查询在PDF.NET3.5以后方可以支持,实例代码需要在PDF.NET 4.1以上支持,PDF.NET本身仅需要.net 2.0支持,框架的最新版本没有公开发布,有关框架的详细信息请看官网介绍: http://www.pwmis.com/sqlmap