開發這個框架,主要起源於有很多使用ALinq或者Linq to SQL的用戶,經常向我抱怨,它們使用起來的確很爽,但是動態查詢太讓人糾結了。這個框架主要就是想解決客戶碰到的動態查詢的問題。至今為至,已經斷斷續續地寫了一年多了,寫這個框架,充滿了挑戰與樂趣。當然,現在更覺得,能把文檔寫好,更是挑戰。大多數的程序員,一直對於寫文檔這碼事,不大重視,我也是其中的一員。但是,長期地與客戶打交道,讓我認識到,文檔是非常地重要的,而且,能把文檔寫好也不是件容易的事情。這次的發布,更多的精力放在了文檔的編寫上。所以,在這次的發布包里,你們會看到一份非常用心寫的,非常詳細的文檔。
正如你們在標道上看到的,ALinq Dynamic 是高仿Entity Framework的,為什么要山寨,而不是另外創造一種語法?
1)不希望加重用戶的學習負擔,現在的框架已經夠多。每多一種語法,就多一份的學習成本。
2)我覺得Entity SQL設計得很好,與SQL極為接近,用戶基本上不需要花什么時間就能上手了。SQL誰不會寫呢?
所以我認為,為了創新而去創新是件毫無意義的事情,一切必須是服務於用戶,不能服務於用戶的創新是沒有意義的。
當然,除了山寨,ALinq Dynamic也進行了一系列的微創新,但目的只有一個,服務用戶,給用戶帶來更多的便利。這些微創新,在后面會提到。
ALinq Dynamic V1.5 這個版本,做了重大的更新,修正了大量的BUG,已經實現了Entity SQL 95% 的功能(不支持的,都是極個別用不到的方法),同時提供的長達40多頁的完整文檔,它是一個里程碑版本,各位鄉親父老們,絕對不容錯過。
下載地址: http://esql.codeplex.com/
授權
ALinq Dynamic 是開源,並且使用 MIT 授權協議的。這是一個非常寬松的授權,你知道的。我也不介意大家能夠在此基礎上,開發出更為優秀、卓越的框架,無論是免費的或者商業的。真心期待國內能夠涌現出更多高水准的作品。
簡介
ALinq Dynamic 為ALinq以及Linq to SQL提供了一個Entiy SQL的查詢接口,使得它們能夠應用Entity SQL 進行數據的查詢。它的原理是將Entiy SQL解釋為Linq表達式,再執行生成的Linq表達式。
亮點
ALinq Dynamic 除了高仿 Entity Framework,還有着許多亮點。
1、與Linq Expression無縫對接。與Linq Expression的無縫對接,使得在編寫esql語句時,具有高度的靈活性。可以很好地結合靜態查詢與動態查詢的優點。
示例一
使用參數化數據源。你可以使用一個Linq的查詢,作為一個參數傳入到esql語句中。
var employees = db.Employees.Where(o => o.Country == "EN"); var esql = "select e from @0 as e where e.LastName != 'Mak'"; var q = db.CreateQuery(esql, employees);
示例二
支持利用索引器進行查詢,為弱類型的查詢帶來了極大的方便。
var esql = @"select e.FirstName, e.LastName from Employees as e"; var q = db.CreateQuery<IDataRecord>(esql) .Where(o=> (string)o["FirstName"] != "Mike");
2、支持基於接口的查詢
基本於對接口查詢的支持,在使用時,具有以下幾個好處
1)為代碼封接提供了極大的使用,例如你可以實體類,抽象出一個最為基本的接口,然后提供一些常用的調用方法。
2)可以動態生成實體類,而不必在編譯期就生成。例如你可以在運行時生成實體類,這樣做的好處是,當你需要向表添加字段時,不需重新生成實體。而新增的字段,可以通過索引器來使用。
3)使得基於AOP的注入的應用成為了可能。
示例
下面的示例是基於接口的查詢示例,值得注意的是,Employee實體類繼承了IEmployee接口。
var esql = "select e from Employees as e"; var q = db.CreateQuery<IEmployee>(esql) .Where(o => o.FirstName == "F" && o.LastName == "L") .Select(o => new { o.FirstName, o.LastName, o.BirthDate });
使用
1、對於 ALinq 用戶,引用 ALinq.Dynamic,於對於Linq to SQL用戶,則引用System.Linq.Dynamic。這兩個程序集,可以在下載的壓縮包中的binary文件夾中找到。
2、在代碼中,導入ALinq.Dynamic的命名空間。
下面是一個完整的示例。
using System; using NorthwindDemo; using ALinq.Dynamic; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var db = new NorthwindDataContext(@"D:\esql\source\db\Northwind.db3"); var esql = "select p from Product as p"; var q = db.CreateQuery<Product>(esql); foreach (var item in q) Console.WriteLine(item.ProductName); } } }
關於ALinq的版本
ALinq Dynamic使用的是ALinq最新的免費版,如果你使用的是其它版本,需要在App.config中設置,或者重新編譯代碼。請參數下面的例子:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" /> <bindingRedirect oldVersion="1.0.0.0-1.0.66.0" newVersion="1.0.61.0" /> </dependentAssembly> </assemblyBinding>