從本章開始將使用兩章節的篇幅來介紹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介面非常方便的構造出各種複雜程度的語句對象。
本節內容到此已全部講述完畢,如果有疑問,或者需要支援人員可以訪問我們網站:http://www.WideUnion.com。提出您的問題或者在論壇中提交問題,同時我們也非常希望能聽到您的建議和需求,以便我們為您提供更好的產品和服務。