輕量級高性能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這種自由的寫法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM