轻量ORM-SqlRepoEx (一)SqlRepoEx介绍

一、SqlRepo项目

发现SqlRepo项目库是在构建自动代码工具时。对于数据访问,在.Net下,有很多选择,比如EF,但EF使用起来,不是很方便的。以前一直使用Atk.Expression库+System.Data.SqlClient来进行数据操作,总体来说希望有这样一个ORM:

1、能方便支持Mysql、SQLServert等数据库;

2、框架不能复杂、功能强大但不需要牺牲数据访问速度;

3、能使用Lambda表达式,以方便.Net强大的功能;

4、使用强类型而不是弱类型构建;

5、能需时转换成SQL语句,易用Lambda表达式来构建拼接SQL语句,减少魔法字串的出现。

SqlRepo项目是一个.NET库,用于构建带有Lambda表达式的SQL语句,并将结果映射到对象的工具。在使用SqlRepo中,发现基本能达到要求。但在使用中,发现不少bug,同时功能上不是特别完善,所以Fork了一个,强化其功能,将其命名为SqlRepoEx。并增加如下(1)自定特性;(2)、动态指定查询源;(3)解决拼接语句,使用where以外方法时,缺少Where子句时的错误;(4)、增加操作时,不再受限于实例必需有Id的自增自段;(5)、表达示使时,可直接使用变量;

二、简单的例子


1、有如下业务类

 

 public class ToDo
    {
        public DateTime CreatedDate { get; set; }
        public bool IsCompleted { get; set; }
        public string Task { get; set; }
    }


2、使用SqlRepoEx查询


 var repository = RepoFactory.Create<ToDo>();
 var results = repository.Query()
            .Select(e => e.Id, e => e.Task, e => e.CreatedDate)
            .Where(e => e.IsCompleted == false)
            .Go();


3、在2中,如果与数据库连接访问,可以直接返回一个IEnumerable<ToDo>的结果集,如果只需要获取SqL语句只需要:


 string querystr = repository.Query()
            .Select(e => e.Id, e => e.Task, e => e.CreatedDate)
            .Where(e => e.IsCompleted == false)
            .Sql();
querystr结果为:"SELECT [dbo].[ToDo].[Id] , [dbo].[ToDo].[Task], [dbo].[ToDo].[CreatedDate]
        FROM [dbo].[ToDo]
        WHERE ([dbo].[ToDo].[IsCompleted] = 0)"

三、关于SqlRepoEx性能,在原生的SqlRepo有对其进行对比测试:


比较库

1、SqlRepo

2、Dapper

3、EF Core 2.0
测试环境

1、每个测试都运行在包含5万条记录的SQL数据库上。测试运行105次,前5个测试被忽略,以支持JIT和任何动态IL。

2、测试机器是一个在i7 7700 k上运行4个核心的VM。最后一次是在2018年3月4日。

 

 测试:选择返回所有记录(Select All Records)

最好结果(ms)总时间
Dapper 51.03ms 6250.34ms
EF Core 163.11ms 19874.59ms
SqlRepo 50.34ms 6260.17ms

 

 

 

 

 

 

测试:选择一条记录(Select TOP 1)

最好结果(ms)总时间
Dapper 0.3ms 73.73ms
EF Core 0.66ms 42.85ms
SqlRepo 0.35ms 40.16ms

 

 

 

 

测试:Select TOP 5000

最好结果(ms)总时间
Dapper 3.91ms 533ms
EF Core 9.81ms 2082.93ms
SqlRepo 4ms 526.43ms

 

 

 

 

 

测试:动态数据测试

最好结果(ms)总时间
Dapper 13.16ms 2382.85ms
EF Core 39.93ms 5106.13ms
SqlRepo 12.74ms 2284.85ms

 

 

 

 

 

具体测试源码见 https://github.com/SqlRepo/Benchmarks

 

posted @ 2018-09-26 14:52  Tikyang  阅读(454)  评论(0编辑  收藏  举报