HTML5技术

轻量级高性能ORM框架:Dapper高级玩法 - 云中客

字号+ 作者:H5之家 来源:H5之家 2017-07-02 13:02 我要评论( )

Dapper高级玩法1: 数据库中带下划线的表字段自动匹配无下划线的Model字段。 Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; 备注: 这个对使用Mysql数据库的朋友最有帮助,因为Mysql默认都是小写,一般字段都带下划线,比如:user_name之类。 具

Dapper高级玩法1:

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

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

备注:

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

 

具体效果如下演示

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

image

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设置时的数据抽取

image

没有绑定成功??

这是因为用了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(); }

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

扩展方法:

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(); }

 

输出结果:

image

 

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

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) - 渡劫的机器猫

    easyui框架--基础篇(一)--数据表格datagrid(php与mysql交互) -

    2017-07-02 17:03

  • 【原】无脑操作:eclipse + maven搭建SSM框架 - {name:代码屠夫}

    【原】无脑操作:eclipse + maven搭建SSM框架 - {name:代码屠夫}

    2017-06-30 17:04

  • 2017年前端框架、类库、工具大比拼 - 葡萄城控件技术团队

    2017年前端框架、类库、工具大比拼 - 葡萄城控件技术团队

    2017-06-20 12:00

  • .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】 - 孙凯旋

    .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】 - 孙凯旋

    2017-06-19 17:00

网友点评