轻型的ORM类Dapper
时间:2022-04-23
本文章向大家介绍轻型的ORM类Dapper,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll。官方站点http://code.google.com/p/dapper-dot-net/ ,也可以通过Nuget进行安装
- Dapper很快。Dapper的速度接近与IDataReader。
- Dapper支持主流数据库 Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库
- 支持多表并联的对象。支持一对多 多对多的关系,并且没侵入性。
- 原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象
- Dapper语法十分简单。并且无须迁就数据库的设计
Query()方法: Query()是IDbConnection扩展方法并且重载了,从数据库里提取信息,并用来填充我们的业务对象模型。
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也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象。
1,在填充嵌套对象的时候,只好执行ToList<>方法,否则回报ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭,而单个对象不会报错,估计是using结束后关闭了连接,而嵌套对象在map的时候又执行了ExecuteReader,只好在using结束之前返回list集合。 2,嵌套对象的参数是比较多的,主要是前两个参数,其它参数没用可以设置为null。特别要注意的是splitOn,这个参数不能为空,否则会报对象为引用的错误。【splitOn参数的意思是读取第二个对象的的分割列,从哪个列起开始读取第二个对象,如果表里的自增长列都为Id,可以设置这个参数为”Id”】.
Execute方法: 正如Query方法是检索数据的,Execute方法不会检索数据,它与Query方法非常相似,但它总返回总数(受影响的行数),而不是一个对象集合【如: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; }
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用brew cask安装minikube的各种错误和解决方法
- 编写高质量可维护的代码:一目了然的注释
- SAP Hybris - how to find corresponding cronjob for a given import
- Linux与Windows间文件互传之TFTP方式
- 假设检验在数据分析中的应用
- 【前端开发】文本阴影:如何使用text-shadow实现首字线索引效果?
- 9.25【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- 竞赛比完,代码、模型怎么处理?Kaggle大神:别删,这都是宝藏
- 9.26【前端开发】背景属性:样式中背景色和背景图片样式如何使用?
- 9.27【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- 9.28【前端开发】文本属性:如何使用文本阴影等样式?
- 9.29【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- Angular input控件的click事件表达式如何被转换成JavaScript函数
- Angular input控件的click事件响应处理的调用上下文
- SAP Spartacus cms.service.ts getComponentData