輕型的ORM類Dapper
Dapper是一個(gè)輕型的ORM類。代碼就一個(gè)SqlMapper.cs文件,主要是IDbConnection的擴(kuò)展方法,編譯后就40K的一個(gè)很小的dll。官方站點(diǎn)http://code.google.com/p/dapper-dot-net/ ,也可以通過Nuget進(jìn)行安裝
- Dapper很快。Dapper的速度接近與IDataReader。
- Dapper支持主流數(shù)據(jù)庫(kù) Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的數(shù)據(jù)庫(kù)
- 支持多表并聯(lián)的對(duì)象。支持一對(duì)多 多對(duì)多的關(guān)系,并且沒侵入性。
- 原理通過Emit反射IDataReader的序列隊(duì)列,來快速的得到和產(chǎn)生對(duì)象
- Dapper語法十分簡(jiǎn)單。并且無須遷就數(shù)據(jù)庫(kù)的設(shè)計(jì)
Query()方法:
Query()是IDbConnection擴(kuò)展方法并且重載了,從數(shù)據(jù)庫(kù)里提取信息,并用來填充我們的業(yè)務(wù)對(duì)象模型。
var counters = new List<Tuple<int, PerformanceCounter>>();
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString))
{
conn.Open();
string sql = string.Format("select Id,ServiceName,CategoryName,CounterName,InstanceName from service_counters where MachineName='{0}'",machineName);
foreach (var counter in conn.Query<ServiceCounter>(sql))
{
logger.InfoFormat(@"Creating performance counter: {0}\{1}\{2}\{3}", counter.MachineName ?? ".", counter.CategoryName,
counter.CounterName, counter.InstanceName);
var perfCounter = new PerformanceCounter(counter.CategoryName, counter.CounterName, counter.InstanceName, counter.MachineName ?? ".");
counters.Add(new Tuple<int, PerformanceCounter>(counter.Id, perfCounter));
// first value doesn't matter so we should call the counter at least once
try { perfCounter.NextValue(); }
catch { }
}
}
下面是ServiceCounter的定義
public class ServiceCounter
{
public int Id { get; set; }
public String ServiceName { get; set; }
public String MachineName { get; set; }
public String CategoryName { get; set; }
public String CounterName { get; set; }
public String InstanceName { get; set; }
public String DisplayName { get; set; }
public String DisplayType { get; set; }
public override String ToString()
{
return String.Format(@"{0}\{1}\{2}\{3}", MachineName ?? ".", CategoryName, CounterName, InstanceName);
}
}
Dapper也可以加載填充嵌套對(duì)象,考慮這樣一種情形,考慮到新聞的類別屬性,返回類別對(duì)象。
1,在填充嵌套對(duì)象的時(shí)候,只好執(zhí)行ToList<>方法,否則回報(bào)ExecuteReader 要求已打開且可用的連接。連接的當(dāng)前狀態(tài)為已關(guān)閉,而單個(gè)對(duì)象不會(huì)報(bào)錯(cuò),估計(jì)是using結(jié)束后關(guān)閉了連接,而嵌套對(duì)象在map的時(shí)候又執(zhí)行了ExecuteReader,只好在using結(jié)束之前返回list集合。
2,嵌套對(duì)象的參數(shù)是比較多的,主要是前兩個(gè)參數(shù),其它參數(shù)沒用可以設(shè)置為null。特別要注意的是splitOn,這個(gè)參數(shù)不能為空,否則會(huì)報(bào)對(duì)象為引用的錯(cuò)誤。【splitOn參數(shù)的意思是讀取第二個(gè)對(duì)象的的分割列,從哪個(gè)列起開始讀取第二個(gè)對(duì)象,如果表里的自增長(zhǎng)列都為Id,可以設(shè)置這個(gè)參數(shù)為”Id”】.
Execute方法:
正如Query方法是檢索數(shù)據(jù)的,Execute方法不會(huì)檢索數(shù)據(jù),它與Query方法非常相似,但它總返回總數(shù)(受影響的行數(shù)),而不是一個(gè)對(duì)象集合【如:insert update和delete】.
private void SaveServiceSnapshots(IEnumerable<ServiceCounterSnapshot> snapshots)
{
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlDiagnosticsDb"].ConnectionString))
{
conn.Open();
foreach (var snapshot in snapshots)
{
// insert new snapshot to the database
conn.Execute(
@"insert into service_counter_snapshots(ServiceCounterId,SnapshotMachineName,CreationTimeUtc,ServiceCounterValue) values (
@ServiceCounterId,@SnapshotMachineName,@CreationTimeUtc,@ServiceCounterValue)", snapshot);
}
}
}
ServiceCounterSnapshot的定義如下:
public class ServiceCounterSnapshot
{
public int Id { get; set; }
public int ServiceCounterId { get; set; }
/// <summary>
/// Machine on which the snapshot was taken.
/// </summary>
public String SnapshotMachineName { get; set; }
public DateTime CreationTimeUtc { get; set; }
public float? ServiceCounterValue { get; set; }
}
歡迎大家掃描下面二維碼成為我的客戶,扶你上云


浙公網(wǎng)安備 33010602011771號(hào)