轻量ORM-SqlRepoEx (一)SqlRepoEx介绍

一、SqlRepo项目

对于数据访问,在.Net下,有很多选择,比如EF,但EF使用起来,不是很方便的。以前一直使用Atk.Expression库+System.Data.SqlClient来进行数据操作,总体来说希望有这样一个ORM:

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

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

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

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

5、能在需要转换成SQL语句;

6、易用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)总时间
Dapper51.03ms6250.34ms
EF Core163.11ms19874.59ms
SqlRepo50.34ms6260.17ms

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

最好结果(ms)总时间
Dapper0.3ms73.73ms
EF Core0.66ms42.85ms
SqlRepo0.35ms40.16ms

测试:Select TOP 5000

最好结果(ms)总时间
Dapper3.91ms533ms
EF Core9.81ms2082.93ms
SqlRepo4ms526.43ms

测试:动态数据测试

最好结果(ms)总时间
Dapper13.16ms2382.85ms
EF Core39.93ms5106.13ms
SqlRepo12.74ms2284.85ms

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值