云中客

梦想有多大,就能走多远

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  138 随笔 :: 3 文章 :: 173 评论 :: 30万 阅读

Dapper高级玩法1:

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

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

备注:

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

 

具体效果如下演示

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

image

2,创建Model模型

1
2
3
4
5
6
7
8
public class User
    {
        public int UserID { get; set; }
 
        public string UserName { get; set; }
 
        public int RoleID { get; set; }
    }

 

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

select * from [user]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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设置时的数据抽取

image

没有绑定成功??

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

 

5,设置MatchNamesWithUnderscores再次数据抽取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
        }

image

数据绑定成功。

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

 

Dapper高级玩法2:

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

 

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

image

image

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

扩展方法:

1
2
3
4
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);
        }

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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();
        }

 

image

成功取到数据。

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函数中将数据添加到外部字典中,这在复杂数据处理时很有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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();
        }

 

输出结果:

image

 

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

posted on   走遍江湖  阅读(9749)  评论(27编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏