zoukankan      html  css  js  c++  java
  • 轻量级高性能ORM框架:Dapper高级玩法

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

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

    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这种自由的写法。

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/DapperSuperFunction.html
Copyright © 2011-2022 走看看