• 轻量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

  • 相关阅读:
    Python-pymysql
    MySQL学习(3)
    MySQL学习(1)
    MySQL与PostgreSQL哪个更好?
    svn与git区别
    journalctl常用命令
    Spring Cloud 生产环境性能优化
    springcloud优雅停止上下线与熔断
    istio基础详解
    微服务的全链路监控
  • 原文地址:https://www.cnblogs.com/athinker/p/9700233.html
Copyright © 2020-2023  润新知