从本章开始将使用两章节的篇幅来介绍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 Company
WHERE Company.ID > @ParamName1

更新语句:

UPDATE Company SETCompany.CompanyName = @ParamName1,Company.Address = NULL FROM Company
WHERE 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.CurrEntityTag
FROM (SELECT BaseEntity.ID, BaseEntity.BaseName, 'BaseEntity' AS CurrEntityTag
        FROM BaseEntity UNION ALL
      SELECT SubEntity.ID, SubEntity.BaseName, 'SubEntity' AS CurrEntityTag
        FROM SubEntity) AS BaseEntity
WHERE 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接口非常方便的构造出各种复杂程度的语句对象。

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

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

EntityModelStudio系列教程5--EMLib框架之Eql相关推荐

  1. EntityModelStudio系列教程

    由于教程中有较多的图片,就发表在其他地方了,教程内容会逐步发布,敬请持续关注. EntityModelStudio系列教程1--初识EntityModelStudio EntityModelStudi ...

  2. EntityModelStudio系列教程2--静态建模之实体模型设计

    在EMStudio中静态建模的概念和内容是来自于UML标准的,所以EMStudio提供的静态建模的设计能力是完全可以满足开发者的设计要求的.但是与UML标准比较,EMStudio中的静态建模还存在两个 ...

  3. python机器学习系列教程——深度学习框架比较TensorFlow、Theano、Caffe、SciKit-learn、Keras

    全栈工程师开发手册 (作者:栾鹏) python教程全解 Theano Theano在深度学习框架中是祖师级的存在.Theano基于Python语言开发的,是一个擅长处理多维数组的库,这一点和nump ...

  4. Silverlight实例教程 - Navigation导航框架系列汇总

    Silverlight实例教程导航框架系列,结合实例讲述Silverlight导航开发基础,该教程不仅仅适用于Silverlight,而且可以被应用于Windows Phone开发领域. 文章列表: ...

  5. Docker框架使用系列教程(七)Dockerfile镜像创建

    docker框架系列教程已经到第七期了,今天我们介绍一下Dockerfile镜像的创建,重点都在内部进行了标注,喜欢记得分享收藏. Dockerfile创建镜像 Dockerfile由一行行命令语句组 ...

  6. Docker框架使用系列教程(六)创建镜像

    到这里docker系列教程已经是第六期了,今天小千来给大家介绍一下docker镜像的创建方法,还是老规矩喜欢的话记得收藏起来. 创建镜像 当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求 ...

  7. ABP框架搭建项目系列教程基础版

    我现在要着手一个新的项目,也打算用这个框架,所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来. 经过前面十二篇的基础教程,现在终于该做个总结了. 第一篇,我们建议新手朋友们先通过ABP ...

  8. python数据挖掘系列教程——PySpider框架应用全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python数据挖掘系列教程--PySpider框架应用全解. PySpider介绍 pyspider上手更简单,操作更加简便,因为它增加了 ...

  9. 老周的ABP框架系列教程

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

最新文章

  1. 这个 GitHub Trending 让我在腾讯会议中“换脸成”任何人!来唠唠如何上手
  2. bugfree-工具
  3. Ubuntu 默认输入法切换(更改)--- 解决中文输入问题
  4. 物联网安全威胁及应对措施
  5. 【Linux系统编程】进程间通信概述
  6. 关于项目中的日期提交
  7. 路由器扫描的Java源码
  8. transaction type popup window when create service order
  9. linux 拆分文件 多个,linux – 如何拆分文件并保留每个部分的第...
  10. C#中的泛型化方法的实现
  11. html新增伪类,css3新增伪类有哪些
  12. 2022数据库排行榜新鲜出炉!MySQL大势已去,PostgreSQL即将崛起!
  13. FineReport:关于扩展行列求各种条件下的函数运用
  14. 大恒水星相机硬触发测试
  15. cboard 图表类型及其配置项扩展
  16. 基于Java模板技术动态生成Word文档
  17. (C/C++/Java)判断中文、字符串、数字是否为“回文”
  18. katacontainers启动分析
  19. 创建表 编码_创建没有编码的专业商业网站
  20. 问题解决:LaTeX biblatex 参考文献出现 [S.l.]: [s.n.]的问题

热门文章

  1. LYNC显示用户位置的相关配置
  2. 在RedHat4 64位操作系统下,安装Oracle 10g
  3. 基于移动设备的Wifi开发组件
  4. Google实用搜索秘技六则
  5. 【Python-ML】神经网络激励函数-双曲正切(hyperbolic tangent,tanh)函数
  6. centos下新建超级用户及sudoers权限问题
  7. Springer投稿 tex上传PDF乱码
  8. Nacos注册中心——启动相关的配置
  9. JVM的标配参数和X参数
  10. SpringMVC的概念