博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EntityModelStudio系列教程5--EMLib框架之Eql
阅读量:5267 次
发布时间:2019-06-14

本文共 3280 字,大约阅读时间需要 10 分钟。

从本章开始将使用两章节的篇幅来介绍EMLib框架,这一章介绍Eql相关的内容。在介绍Eql内容之前需要做一个准备工作,那就是开发环境的配置,这是一个非常简单的工作。

一.配置开发环境

由于笔者使用的是VS2010,所以用VS2010作为开发环境来介绍,但是所讲述的内容同样适用于VS2008。首先创建一个新的工程,语言是C#,类型是Windows Form Application,工程名字和保存目录位置任意。创建完成后如下图所示:

鼠标右击工程节点,在弹出菜单中选择Add—>Existing Item…,打开生成源代码所在的目录。先添加EDModel.Biz.EDExtern文件夹中的EDModel.cs文件,注意是引用添加,如图所示:

然后添加EDModel.Biz.EDCustom文件夹中的文件,注意是复制添加,即直接点击Add按钮就,如下图所示:

添加完成后如下图所示:

接着引用EMLib动态链接库。EMLib.dll文件在EMStudio安装目录的EMLib文件夹下。鼠标右击References节点,在弹出菜单中选择Add Reference…,打开EMStudio安装目录,再打开EMLib文件夹,添加EMLib.dll文件。添加完以后,如下图所示:

最后一步是在源代码文件中添加命名空间,打开Form.cs文件,在文件头部加入EMLib命名空间的引用和生成的源代码所在命名空间的引用,如下图所示:

至此开发环境就配置完成了。

一.Eql基本语句的使用

Eql的全称是实体查询语言(Entity Model Studio),这是一种基于宿主语言的编程接口。允许开发者以方法连续调用的方式,非常方便和灵活的构造出各种复杂程度的语句对象。其开发效率明显高于传统字符串拼接构造Sql语句的方式。同时基于Eql语句对象,可以使用EMLib完成所有强大的ORM功能。以下是查询,更新,插入,删除语句的演示代码,读者可以自行输入源代码完成实际的Eql语句对象的构造。

查询语句:

更新语句:

插入语句:

删除语句:

三.从Eql语句对象获得Sql语句文本

EMLib直接支持从Eql语句对象获得对应等价文本的功能,举例代码如下图所示:

StmtTextUnit有两个属性,一个是TextWithParam,这个就是对应的等价文本;另一个是Parms,这个是语句文本中用到的参数的对象。可以看到上述代码为了得到Sql文本首先生成了一个EMContext的对象,调用的是MyContext中方法。这个类和方法是自动生成的,在EDModel.cs文件中。该方法的第一个参数是模型文件所在位置。模型文件在生成源代码时自动生成,在EDModel.Biz.EDExtern文件夹中,是一个xml文件。第二个参数是EMLib的许可证文件。在EMStudio通过注册后该文件会被自动生成,位置在EMStudio安装目录的EMLib文件夹中,是一个dat文件。关于EMContext对象的内容,在下一章节EMLib框架之Orm中还会进一步详细介绍。

用EqlBuildSqlText可以为上面四个语句对象生成对应的等价文本,如下所示:

查询语句:

SELECT Company.ID, Company.Address, Company.CompanyName, 'Company' AS CurrEntityTag FROM CompanyWHERE Company.ID > @ParamName1

更新语句:

UPDATE Company SET  Company.CompanyName = @ParamName1,  Company.Address = NULL FROM CompanyWHERE Len(Company.Address) < @ParamName2

插入语句:

INSERT INTO Company (Company.CompanyName, Company.Address)VALUES (@ParamName1, NULL)

删除语句:

DELETE Company FROM Company WHERE Len(Company.Address) < @ParamName1

四.Eql对多态的支持

Eql对多态的支持是非常彻底而完整的,从语句结构和ORM功能角度来说,这种对多态性的支持是完备的。下面简单的演示两个例子来介绍这种对多态性的支持,更为详细的介绍在下一章节中完成。构造如下的Eql语句对象:

这是一个对BaseEntity实体执行多态查询的Eql语句对象,其对应的等价文本如下:

SELECT BaseEntity.ID, BaseEntity.BaseName, BaseEntity.CurrEntityTagFROM (SELECT BaseEntity.ID, BaseEntity.BaseName, 'BaseEntity' AS CurrEntityTag        FROM BaseEntity UNION ALL      SELECT SubEntity.ID, SubEntity.BaseName, 'SubEntity' AS CurrEntityTag        FROM SubEntity) AS BaseEntityWHERE BaseEntity.ID > @ParamName1

构造如下的删除语句:

这表示要对实体BaseEntity执行多态删除,也就是要删除BaseEntity及其子类的满足条件的数据。其对应的等价文本就是两条删除语句:

DELETE PolySubjectFROM (SELECT BaseEntity.ID, BaseEntity.BaseName, 'BaseEntity' AS CurrEntityTagFROM BaseEntity UNION ALLSELECT SubEntity.ID, SubEntity.BaseName, 'SubEntity' AS CurrEntityTagFROM SubEntity) AS BaseEntity, BaseEntity AS PolySubjectWHERE BaseEntity.ID > @ParamName1 ANDBaseEntity.CurrEntityTag = 'BaseEntity' ANDPolySubject.ID = BaseEntity.IDDELETE PolySubjectFROM (SELECT BaseEntity.ID, BaseEntity.BaseName, 'BaseEntity' AS CurrEntityTagFROM BaseEntity UNION ALLSELECT SubEntity.ID, SubEntity.BaseName, 'SubEntity' AS CurrEntityTagFROM SubEntity) AS BaseEntity, SubEntity AS PolySubjectWHERE BaseEntity.ID > @ParamName1 ANDBaseEntity.CurrEntityTag = 'SubEntity' ANDPolySubject.ID = BaseEntity.ID

五.子查询

如下图所示是一个子查询的例子:

为了方便阅读和理解也可以拆分写成如下的形式:

两者是完全等价的。以这种方式开发者可以用Eql接口非常方便的构造出各种复杂程度的语句对象。

 

本节内容到此已全部讲述完毕,如果有疑问,或者需要技术支持可以访问我们网站:。提出您的问题或者在论坛中提交问题,同时我们也非常希望能听到您的建议和需求,以便我们为您提供更好的产品和服务。

转载于:https://www.cnblogs.com/WideUnion/archive/2012/09/22/2698351.html

你可能感兴趣的文章
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
A-Softmax的总结及与L-Softmax的对比——SphereFace
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
linux下WPS的使用
查看>>
Web Api 利用 cors 实现跨域
查看>>