• 轻量级高性能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这种自由的写法。

  • 相关阅读:
    常用集体名词的用法
    囊中羞涩的表达
    《当幸福来敲门》观后感
    <肖申克的救赎>观后感
    心语4
    补充:回答网友的问题,如何不用路径,而直接将CImage画到DC中,之后DC一起显示.
    线程中对变量的用法
    添加按键变量数组,就是很多同种类型按键关联变量,这些变量是一个数组;
    不容按钮、下拉框 执行同一个函数或者同一种函数的用法
    CImage显示位图与CDC双缓冲冲突,使用路径层解决.
  • 原文地址:https://www.cnblogs.com/lixiaobin/p/DapperSuperFunction.html
Copyright © 2020-2023  润新知