开发这个框架,主要起源于有很多使用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 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>