轻型的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; }   
}    

A Look at Dapper.NET

关于Dapper的一些使用和扩展的例子

给力分享新的ORM => Dapper

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏五毛程序员

五毛的cocos2d-x学习笔记02-基本项目源码分析

2266
来自专栏张善友的专栏

ASP.NET SignalR HubPipelineModule

ASP.NET SignalR 1.0 实现的一个特性HubPipeline -实现任何消息incoming和outgoing的拦截。SignalR HubPi...

2137
来自专栏机器人网

中英文对照,瞬间理解西门子PLC指令

指令( 英文全称意思 ) :指令含义 1、LD ( Load 装载 ) :动合触点 2、LDN ( Load Not 不装载 ) : 动断触点 3、A ( A...

3557
来自专栏nice_每一天

Elasticsearch JavaApi

 官网JavaApi地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/curre...

5644
来自专栏岑玉海

hbase源码系列(九)StoreFile存储格式

从这一章开始要讲Region Server这块的了,但是在讲Region Server这块之前得讲一下StoreFile,否则后面的不好讲下去,这块是基础,Re...

3925
来自专栏窗户

我博客上的围棋js程序

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址   http://www.cnblogs.com/Colin-C...

4996
来自专栏Java3y

阅读SSM项目之scm

导入项目 项目是由eclipse来编写的,我使用的开发环境是Idea,那么就需要将eclipse项目导入进去Idea中。要想项目能够启动起来。是这样干的: 导入...

34711
来自专栏程序员的SOD蜜

.net访问PostgreSQL数据库发生“找不到函数名”的问题追踪

    PostgreSQL是一个使用广泛的免费开源的数据库,与MySQL比较,它更适合复杂的企业计算任务,而MySQL在互联网领域应用更为广泛,究其原因,可能...

3637
来自专栏MasiMaro 的技术博文

PE解析器的编写(四)——数据目录表的解析

在PE结构中最重要的就是区块表和数据目录表,上节已经说明了如何解析区块表,下面就是数据目录表,在数据目录表中一般只关心导入表,导出表和资源这几个部分,但是资源实...

2552
来自专栏云计算教程系列

如何在Python 3中安装pandas包和使用数据结构

Python pandas包用于数据操作和分析,旨在让您以更直观的方式处理标记或关系数据。

2.5K0

扫码关注云+社区

领取腾讯云代金券