EntityModelStudio系列教程5--EMLib框架之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 CurrEntityTagFROM 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关键字static在C和C++中的区别
- 下一篇: 农忙……