代码改变世界

高仿Entity Framework?Linq to SQL也有春天!

2013-03-05 18:06  麦舒  阅读(5485)  评论(43编辑  收藏  举报

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