輕量級高效能ORM架構:Dapper進階玩法

來源:互聯網
上載者:User

標籤:sha   directory   als   build   協助   map   builder   結果   rgs   

Dapper進階玩法1:

資料庫中帶底線的表欄位自動匹配無底線的Model欄位。

Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;

備忘:

這個對使用Mysql資料庫的朋友最有協助,因為Mysql預設都是小寫,一般欄位都帶底線,比如:user_name之類。

 

具體效果如下示範

1,首先建立一張表並插入資料

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設定時的資料幫浦

沒有綁定成功??

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

資料繫結成功。

就一句Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true,讓我們少寫了不少AS語句。

 

Dapper進階玩法2:

法力無邊的Query,由於帶有Function功能,可以自由設定模型繫結邏輯。

 

1,建立兩張有關聯的表,並填入資料。

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

 

輸出結果:

 

今天就介紹到這,後續有時間再添加其他的玩法,個人比較喜好Dapper這種自由的寫法。

輕量級高效能ORM架構:Dapper進階玩法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.