现在的位置: 首页 > 综合 > 正文

EntityModelStudio系列教程5–EMLib框架之Eql

2012年05月01日 ⁄ 综合 ⁄ 共 3047字 ⁄ 字号 评论关闭

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

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, BaseEntity AS PolySubject

WHERE BaseEntity.ID > @ParamName1 AND

BaseEntity.CurrEntityTag = 'BaseEntity' AND

PolySubject.ID = BaseEntity.ID

DELETE PolySubject

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, SubEntity AS PolySubject

WHERE BaseEntity.ID > @ParamName1 AND

BaseEntity.CurrEntityTag = 'SubEntity' AND

PolySubject.ID = BaseEntity.ID

五.子查询

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

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

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

 

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

抱歉!评论已关闭.