(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.NET数据开发框架 之SQL-MAP使用存储过程

注:本文所说的自定义查询在PDF.NET3.5以后方可以支持,实例代码需要在PDF.NET 4.1以上支持,PDF.NET本身仅需要.net 2.0支持,框架的最新版本没有公开发布,有关框架的详细信息请看官网介绍: http://www.pwmis.com/sqlmap

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

013 windows10 mysql的安装

Access denied for user 'root'@'localhost' (using password:YES) 解决方案 问题的解决

1423
来自专栏转载gongluck的CSDN博客

利用xinetd实现简单web服务器(镜像站)

浏览效果: ? linux服务器安装xinetd后,在/etc/xinetd.d/目录下创建xhttpd文件,并输入内容: service xhttpd { ...

4256
来自专栏云计算教程系列

MySQL基础教程:数据的导入导出

学会数据库的导入导出非常重要,为什么呢?向下看。首先您可以把数据转储进行备份和还原,以便在紧急情况下恢复数据库的旧副本。您还可以把数据迁移到新服务器或开发环境。

4066
来自专栏码字搬砖

Hbase优化思路

1.rowkey设计 2.手动split,手动compant 3.开启booleamfilter 4.采用压缩 5.预分区 6.并发读写 ...

1334
来自专栏喵了个咪的博客空间

基于PhalApi的Redis拓展

#基于PhalApi的Redis拓展 ? ##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 编写本次拓展...

3294
来自专栏杂烩

mysql5.7 主从配置 原

    1、master打开my.ini,查看服务找到my.ini位置,不一定一定在安装目录,如:

763
来自专栏面朝大海春暖花开

hibernate for循环执行添加操作出错问题

hibernate插入对象的时候,对于id唯一,数据库设置为自增的时候执行完操作后会将id赋予该对象

1151
来自专栏Laoqi's Linux运维专列

MySQL调优

4529
来自专栏swag code

解决WordPress设置错误的url网站不能访问的问题

1、在wp-config.php中,添加以下两行内容: define(‘WP_HOME’,’http://www.yourdomain.com’); def...

1605
来自专栏乐沙弥的世界

MySQL多实例配置(二)

    MySQL数据库的集中化运维,可以通过在一台MySQL数据库服务器上,部署多个MySQL实例。该功能是通过mysqld_multi来实现。mysqld_...

1302

扫码关注云+社区

领取腾讯云代金券