標籤: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進階玩法