zoukankan      html  css  js  c++  java
  • EntityModelStudio系列教程5EMLib框架之Eql

    从本章开始将使用两章节的篇幅来介绍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。提出您的问题或者在论坛中提交问题,同时我们也非常希望能听到您的建议和需求,以便我们为您提供更好的产品和服务。

  • 相关阅读:
    移植BOA
    [转]Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
    服务器软件设计的算法和问题
    [solve]Bind: Address Already in Use
    Simple guide for Automake/Autoconf by Nick
    Ubuntu(Linux)中设置samba
    VMware不能上网,解决办法
    数组的顺序存储和实现
    根文件系统的构成
    Linux网络编程IP转换函数inet_addr和inet_ntoa
  • 原文地址:https://www.cnblogs.com/WideUnion/p/2698351.html
Copyright © 2011-2022 走看看