小巧方便的ORM类库——PetaPoco
PetaPoco是一个简单轻巧的orm开源类库,全部功能只有一个文件,可以很方便集成到项目中。代替SqlHelper辅助类的不二选择。。。
主要功能包括: - 映射实体类,支持enum,Nullable等类型,可同时映射多个实例。 - 支持分页 - 以@0等占位符代替SqlParameter,传参更方便 - 带有sql字符串构造器,构造条件查询sql非常方便 - update支持指定字段更新 - 支持T4模板
使用示例: 使用前需要先new一个数据库实例:
var db = new PetaPoco.Database("ConnectionName");
可以放心地把db实例设为static,因为实例中没有SqlConnection的引用,连接每次执行完后,会自动关闭。 发现有人反映在web上使用static的db实例还是会有问题,具体可看链接(Link1),StackOverflow中推荐web中每个请求使用一个单独的db实例(Link2). 1、取一条记录
var a = db.SingleOrDefault("SELECT * FROM articles WHERE article_id=@0", 123));
2、分页
// 分页实质在内部是用Row_Number()重写了sql,支持join
var result=db.Page(1, 20, "SELECT * FROM articles WHERE category=@0 ORDER BY date_created DESC", "coolstuff");
上面的分页sql,会被改写为sql:
SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY date_created DESC) peta_rn, * FROM articles WHERE category=@0 ) peta_paged WHERE peta_rn>@1 AND peta_rn
3、部分更新
db.Update("articles", "article_id", new { title="New title" }, 123);
4、sql条件构造
var sql = PetaPoco.Sql.Builder .Append("SELECT * FROM articles") .Append("WHERE article_id=@0", id) .Append("WHERE date_created>=@0", start_date) .Append("WHERE date_created<=@0", end_date);
5、直接执行sql
db.Execute("DELETE FROM articles WHERE draft<>0");
6、调用存储过程
//调用存储过程 db.Execute("exec procSomeHandler @0, @1", 3, "2011-10-01"); //调用带输出(OUTPUT)参数的存储过程, 写的sql语句,@0参数后的“output”是关键 var param = new SqlParameter() { Direction = ParameterDirection.Output, SqlDbType = SqlDbType.Int }; db.Execute("exec procSomeHandler @0 OUTPUT", param);
7、代替返回值DataTable 有时,我们并不想每条执行的sql都需要创建对应的实体类,这样会导致项目中存在过多的实体类,有方法能做到DataTable这样灵活就最好了。在.net4.0中,PetaPoco可以返回dynamic类型,可以很好地解决这个问题,而在.net3.5中就没办法,不过可以通过修改PetaPoco代码,实现使用Dictionary类型来代替dynamic动态类型的功能。改动代码如下:https://github.com/cxfksword/PetaPoco/commit/e07746c06977f09ef8e7a0f81b718e520b4513ed
var list = db.Fetch>("select article_id,date_created from articles");
使用petapoco时有点需要注意,就是当数据库字段数据类型是varchar等非unicode字符类型时,petapoco传参需要把string转换为AnsiString类型,否则会有性能问题。
Ansi String Support DBA guru Rob Sullivan yesterday pointed out that SQL Server has pretty severe performance overhead if you try to query an index with varchar column using a unicode string parameter. To fix this the parameter needs to be bound as DbType.AnsiString. To facilitate this you can now wrap such string parameters in a new AnsiString class: var a = db.SingleOrDefault("WHERE title=@0", new PetaPoco.AnsiString("blah"));
参考资料: http://code.google.com/p/dapper-dot-net/ http://www.toptensoftware.com/petapoco/