年度開源力作,博客園首發,回饋廣大用戶。【Entity SQL for Linq to SQL】


好久沒有在博客園里拋頭露面,距離上一篇博客,想來也有一年了吧。這一年,雖然沒有寫博客,但是還是一直在關注博客園的。這一年當里,博客園似乎變得更為熱鬧了,但是,發布作品的似乎比之前少了很多,能夠一直堅持下來的更是少。很多用戶都問到我,ALinq 很什么時候發布新版,還是已經停止更新了。不止一次說過,只要有一個用戶在用我的產品,都會更新、維護下去的。因為為什么?夢想!我要開發出世界一流的軟件產品,體現自己的價值。

這個開源項目,現在暫且稱之為 ALinq Dynamic 吧,原來是准備作為 ALinq3 的一部份的,但是由於現在已經不再全職投入 ALinq 的開發了,擔心有些 BUG 無法及時給用戶解決,所以決定把它作為一個獨立的開源目,發布給各位用戶使用。現在這個項目已經放到了 CodePlex 上了,網址是:http://esql.codeplex.com/

現在給大家簡單介紹一下這個項目吧。

項目簡介:

ALinq Dynamic 是一個將 Entity SQL 語句轉換為 Linq Expression 的框架,它不但適用於 ALinq,同樣也可以應用於Linq to SQL。

功能特點:

1、支持 Entity SQL 的語法查詢。已經實現了Entity Framework 中 Entity SQL 的絕大部份功能。為什么不自創一種語法?因為我希望能盡可能減少用戶的學習成本。

2、與 Linq 表達式無縫對接,動態查詢,有一個很大的缺點,就是查詢結果是弱類型的。但是,在 ALinq Dynamic 里通過索引器查詢成功解決了這個問題。

為了讓大家對它有個直觀的認識,給出一個典型的例子。

var esql = @"select o.OrderId, o.EmployeeId, d.ProductId, p.UnitPrice 
             from Orders as o 
                  Inner Join OrderDetails as d on o.OrderId == d.OrderId
                  Inner Join Products as p on d.ProductId == p.ProductId";


var q2 = db.CreateQuery<IDataRecord>(esql);
var q3 = q2.Select(o => new { OrderId = (int)o["OrderID"], 
                              EmployeeId = (int)o["EmployeeID"], 
                              ProductId = (int)o["ProductId"] })
           .Where(o => o.OrderId > 1000)
           .Join(db.Employees, o => o.EmployeeId, e => e.EmployeeID,
                          (a, b) => new { a.EmployeeId, 
                                          a.OrderId, 
                                          a.ProductId,
                                          b.City, 
                                          b.Address })
           .Take(10);


q3.Execute();

--------------------------------------------------------------------------------------------------------------------------

2012-12-4 更新

由於很多人吐槽上面例子中的 Select,我還是把它稍作改動吧。下面的例子和上面是等價的。

var esql = @"select o.OrderId, o.EmployeeId, d.ProductId, p.UnitPrice 
    from Orders as o 
        Inner Join OrderDetails as d on o.OrderId == d.OrderId
        Inner Join Products as p on d.ProductId == p.ProductId";


var q2 = db.CreateQuery<IDataRecord>(esql);
var q3 = q2.Where(o => (int)o["OrderId"] > 1000)
            .Join(db.Employees, o => (int)o["EmployeeId"], e => e.EmployeeID,
                            (a, b) => new
                            {
                                EmployeeId = (int)a["EmployeeId"],
                                OrderId = (int)a["OrderId"],
                                ProductId = (int)a["ProductId"],
                                b.City,
                                b.Address
                            })
            .Take(10);


q3.Execute();

根據網友的疑問,我再補充一下吧:

1、關於 SQL ,上面的並不是 SQL ,而是 Entity SQL,不知道什么是 Entity SQL 的,Google 一下吧。

2、為什么不直接用 SQL?這個樣的問題,實在讓我很無語呀,你想想,為什么 EF 要提供一個 Entity SQL,Hibernate 要提供一個 HQL 。實在想不出來,Google 一下為什么要用 ORM,而不用 SQL 吧。

3、在這個示例里,為什么用索引器,而不用 Dynamic ?因為 Linq to SQL 不支持使用 Dynamic 查詢,還有,.NET 3.5 也不支持 Dynamice 關鍵字。

4、ALinq Dynamic ,也就是這個項目,不是一個 ORM 來的,它只是為 Linq to SQL 和 ALinq 提供一個 Entity SQL 的查詢接口。它的原理是將 Entity SQL 轉換成 Linq Expression 來執行。

5、為什么要給 ALinq,Linq to SQL 提供 Entity SQL 的查詢接口?為了更為方便的動態查詢。

另外,希望各位朋友,在語氣上,稍微謙虛禮貌點。

-----------------------------------------------------------------------------------------------------------------------------

 

 

誰會需要它?

需要用到動態查詢的用戶。我想,絕大部份用戶都會碰到動態查詢這個問題,但是,現有的解決方案,都不夠好。ALinq Dynamic 的出現,將 會為 ALinq 和 Linq to SQL 用戶,提供一個更為好用的解決方案。

如何使用:

1、到 CodePlex 上下載壓縮包,網址:http://esql.codeplex.com/ ,然后解壓縮。

2、如果你是 ALinq 用戶,打開 DynamicQuery.sln 或者 DynamicQuery_VS08.sln 解決方案,其中前者是適用於 VS 2010,后者適用於 VS 2008,

3、如果你是 Linq to SQL 用戶,打開 DynamicQuery.LinqToSql.sln (僅適用於 VS 2010 ) 。

4、打開測試項目,然后修改 App.Config,該文件在 DynamicQueryTest 目錄下,所用的數據庫為 SQLite 和 SQL Compact。

5、查看,並運行單元測試中的范例。

關於文檔: 文檔和教程,隨后將至,請大家留意我的博客。

技術支持: 1、在我的博客留言,我會盡可能地抽時間來答復大家的問題。 2、加入 ALinq 用戶的 QQ群(71418067)。

謝謝大家的閱讀,麻煩大伙點一下推薦,再次謝謝大家。 ^_^ 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM