Dapper高級玩法1:
數據庫中帶下划線的表字段自動匹配無下划線的Model字段。
備注:
這個對使用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這種自由的寫法。







