轻量级高性能ORM框架:Dapper高级玩法

Dapper高级玩法1:

数据库中带下划线的表字段自动匹配无下划线的Model字段。

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

备注:

这个对使用Mysql数据库的朋友最有帮助,因为Mysql默认都是小写,一般字段都带下划线,比如:user_name之类。

具体效果如下演示

1,首先创建一张表并插入数据

2,创建Model模型

public class User
    {
        public int UserID { get; set; }

        public string UserName { get; set; }

        public int RoleID { get; set; }
    }

3,扩写抽取数据逻辑代码.

select * from [user]

static Program()
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

            var data = config.Build();
            DapperExtension.DBConnectionString = data.GetConnectionString("DefaultConnection");
        }

        static void Main(string[] args)
        {
            IDbConnection dbconnection = null;

            using (dbconnection = dbconnection.OpenConnection())
            {
                var users = dbconnection.List("select * from [user]", null);
                foreach (var user in users)
                {
                    Console.WriteLine($"{user.UserID}-{user.UserName}-{user.RoleID}");
                }
            }

            Console.ReadKey();
        }

4,无MatchNamesWithUnderscores设置时的数据抽取

没有绑定成功??

这是因为用了Select * from的缘故,取出来的字段是带下划线的与Model的字段不匹配。

5,设置MatchNamesWithUnderscores再次数据抽取

static void Main(string[] args)
        {
            Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
            IDbConnection dbconnection = null;
            using (dbconnection = dbconnection.OpenConnection())
            {
                var users = dbconnection.List("select * from [user]", null);
                foreach (var user in users)
                {
                    Console.WriteLine($"{user.UserID}-{user.UserName}-{user.RoleID}");
                }
            }

            Console.ReadKey();
        }

数据绑定成功。

就一句Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true,让我们少写了不少AS语句。

Dapper高级玩法2:

法力无边的Query,由于带有Function功能,可以自由设置模型绑定逻辑。

1,创建两张有关联的表,并填入数据。

2,抽取user和它关联的role数据。

select 1 as table1,T1.*,1 as table2,T2.* from [user] T1 inner join [role] T2 on T1.role_id = T2.role_id

扩展方法:

public static IEnumerable QueryT(this IDbConnection dbconnection, string sql, Func map, object param = null, IDbTransaction transaction = null, string splitOn = "Id")
        {
            return dbconnection.Query(sql, map, param, transaction, splitOn: splitOn);
        }

使用:

static void QueryTest()
        {
            Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
            IDbConnection dbconnection = null;
            using (dbconnection = dbconnection.OpenConnection())
            {
                var result = dbconnection.QueryT(
                    @"select 1 as table1,T1.*,1 as table2,T2.* from [user] T1 inner join [role] T2 on T1.role_id = T2.role_id",
                    (user, role) =>
                    {
                        user.Role = role;
                        return user;
                    },
                    null,
                    splitOn: "table1,table2");

                foreach (var user in result)
                {
                    Console.WriteLine($"{user.UserID}-{user.UserName}-{user.Role.RoleID}-{user.Role.RoleName}");
                }
            }
            Console.ReadKey();
        }

成功取到数据。

splitOn解释:模型绑定时的字段分割标志。table1到table2之间的表字段绑定到User,table2之后的表字段绑定到Role。

3,特殊Function逻辑。比如抽取role_id对应的user一览。

select 1 as table1,T1.*,1 as table2,T2.* from [role] T1 left join [user] T2 on T1.role_id = T2.role_id

外部定义了一个字典类型,Query内部模型绑定的时候每次调用Function函数,Function函数中将数据添加到外部字典中,这在复杂数据处理时很有用。

static void QueryTest2()
        {
            Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
            IDbConnection dbconnection = null;
            using (dbconnection = dbconnection.OpenConnection())
            {
                Dictionary> dic = new Dictionary>();

                dbconnection.QueryT(
                   @"select 1 as table1,T1.*,1 as table2,T2.* from [role] T1 left join [user] T2 on T1.role_id = T2.role_id",
                   (role, user) =>
                   {
                       if (dic.ContainsKey(role.RoleID))
                       {
                           dic[role.RoleID].Add(user);
                       }
                       else
                       {
                           dic.Add(role.RoleID, new List { user });
                       }

                       return true;
                   },
                   null,
                   splitOn: "table1,table2");

                foreach (var data in dic)
                {
                    Console.WriteLine($"role:{data.Key}");
                    foreach (var user in data.Value)
                    {
                        Console.WriteLine($"user:{user.UserID}-{user.UserName}");
                    }
                }
            }
            Console.ReadKey();
        }

输出结果:

今天就介绍到这,后续有时间再添加其他的玩法,个人比较喜好Dapper这种自由的写法。

时间: 2024-08-05 03:43:42

轻量级高性能ORM框架:Dapper高级玩法的相关文章

.NET轻量级ORM框架Dapper入门精通

一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架Dapper的魅力. 本次分享课程适合人群范围: 一.<.NET轻量级ORM框架Dapper修炼手册>适合人群如下: 1.我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错. 2.对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dappe

十五天精通WCF——第九天 高级玩法之自定义Behavior

原文:十五天精通WCF--第九天 高级玩法之自定义Behavior 终于我又看完了二期爱情保卫战,太酸爽了,推荐链接:http://www.iqiyi.com/a_19rrgublqh.html?vfm=2008_aldbd,不多说,谁看谁入迷,下面言归正传, 看看这个很有意思的Behavior. 一: Behavior这个泼妇的厉害   在前面的文章中,我也清楚的说明了整个wcf通信流,而Behavior这个泼妇可以在wcf通信流中的任何地方插上一脚,蛮狠无比,利用的好,让你上天堂,利用的不

轻量级高性能 RPC 框架 HRPC

HRPC HRPC是一款基于Netty和Zookeeper设计的轻量级高性能RPC框架. 特性 采用Protostuff序列化:高性能,负载均衡:支持服务的注册和订阅:支持同步及异步2种调用方式:长连接,自动重连:采用cglib动态代理:代码简答,易上手:支持Spring: 更多轻量级高性能 RPC 框架 HRPC介绍

【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依赖注入后,你的编程思维就得变一变了.在过去,许多功能性的类型(比如一个加密解密的类),我们都喜欢将其定义为静态(static),而有了依赖注入,你就要避免使用静态类型,应该交由服务容器帮你管理,只要你用好了,你会发现依赖注入是很方便的. 依赖注入的初级玩法,也是比较标准的玩法,此种玩法有两种模式:

maven 高级玩法

maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean install $ mvn -T 1C clean install 跳过测试 -DskipTests # 不执行测试用例,但编译测试用例类生成相应的 class 文件至 target/test-classes 下 -Dmaven.test.skip=true # 不执行测试用例,也不编译测试用例类

PyQt 5信号与槽的几种高级玩法

PyQt 5信号与槽的几种高级玩法 http://www.broadview.com.cn/article/824 在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制.当信号发射时,连接的槽函数将会自动执行.在PyQt 5中信号与槽通过object.signal.connect()方法连接. PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号.信号与槽具有如下特点. 一个信号可以连接多个槽. 一个信号可以

.NET轻量级ORM框架Dapper修炼手册

一.摘要 1.1.为什么叫本次的分享课叫<修炼手册>? 阿笨希望本次的分享课中涉及覆盖的一些小技巧.小技能给您带来一些帮助.希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需,一旦当手头遇到与Dapper修炼手册中相似用法的地方和场景,可以直接拿来进行翻阅并灵活的运用到项目中.最后阿笨建议您可以根据自己在工作中碰到的不同的使用场景,不断的完善此本修炼手册. 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工. 四.涉及覆盖的知识点 1.C# Linq To Xml技术.

轻量型ORM框架Dapper的使用

在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我个人的见解,EF是相对来说比较重的ORM框架,它是讲究通用性的框架,而非单纯的实现某种需求的框架,不得不否认的说,EF的开发效率要比用单纯的ADO.NET写sql语句的效率高的不是一点半点,可能很多人会说EF的性能低等等,针对这种问题有时候是需要折中的来讲,从另一个方面来讲,你用了ADO.NET写s

高性能ORM 框架之 MySqlSugar

一.介简 SqlSugar ORM框架一直在升级当中,昨天将EMIT架构进行了重构,让类型转换更加智能,EMIT转换后的性能和原生ADO同水准(以前只是接近),为了提高性能.稳定.有问必答.有需求必改.坚持更新.例如数据库类型为BIT我们在程序里面可以使用 INT接收也可以用BOOL接收,不影响一丝性能,这些都是SQLSUGAR以前没有的功能. 经过一天的努力,MySql版本所有的例子都已经测试通过: MySql .NET 4.0+ https://github.com/sunkaixuan/M