博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net的轻量级ORM -- PetaPoco/NPOCO框架使用说明
阅读量:4307 次
发布时间:2019-06-06

本文共 4310 字,大约阅读时间需要 14 分钟。

.net的轻量级ORM -- PetaPoco/NPOCO框架使用说明

(具体参看:http://www.toptensoftware.com/petapoco/)

  从11年就开始尝试使用轻量级ORM:PetaPoco,下文是基本使用方法。另外NPoco是PetaPoco的升级版,是另外一个人维护,原版PetaPoco基本不再维护。NPoco大多数用法和PetaPoco一致,另外有些额外的功能。NPoco我会考虑再写一篇文章介绍。

  运行查询

  首先定义POCO

  注:POCO意思是Plain Old CLR Object即指一般指带有无参构造函数只有get set的简单.net类:

// Represents a record in the "articles" tablepublic class article{  public long article_id { get; set; }  public string title { get; set; }  public DateTime date_created { get; set; }  public bool draft { get; set; }  public string content { get; set; }}

查询

// Create a PetaPoco database objectvar db=new PetaPoco.Database("connectionStringName");// Show all articles foreach (var a in db.Query
("SELECT * FROM articles")){Console.WriteLine("{0} - {1}", a.article_id, a.title);}

注意: Database有Fetch和Query两个方法

Fetch返回List<T>.

而Query通过yield return 返回,使得不用遍历记录不用通过转载整个数据到内存里面.

注意:少量数据用Fetch更方便,大量数据而且只是单向遍历或者返回请用Query,以节约内存.

返回单个值

long count=db.ExecuteScalar
("SELECT Count(*) FROM articles");

返回单条记录

var a = db.SingleOrDefault
("SELECT * FROM articles WHERE article_id=@0", 123));

注意:当运行SingleOrDefault返回超过1条记录会报错

分页查询

注意:所有大数据量查询请都使用这个分页的方法,PetaPoco的分页查询是数据库分页.

var result=db.Page
(1, 20, // <-- page number and items per page"SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");

会返回

public class Page
where T:new(){  public long CurrentPage { get; set; }  public long ItemsPerPage { get; set; }  public long TotalPages { get; set; }  public long TotalItems { get; set; }  public List
Items { get; set; }}

运行分页方法,实际上PetaPoco会执行两件事:

返回匹配的所有总记录数.

得到需要的页数的字记录数.

注意:PetaPoco会把你的sql转换成分页sql,所以对sql有一定限制,请不要用select * 而且写得sql严格用空格分开,避免PetaPoco不能正确地解析你的sql.

新增,更新,删除记录

新增

// Create the articlevar a=new article();a.title="My new article";a.content="PetaPoco was here";a.date_created=DateTime.UtcNow;// Insert itdb.Insert("articles", "article_id", a);// by now a.article_id will have the id of the new article

更新

// Get a recordvar a=db.SingleOrDefault
("SELECT * FROM articles WHERE article_id=@0", 123);// Change ita.content="PetaPoco was here again";// Save itdb.Update("articles", "article_id", a);可以用匿名对象更新,以下是仅更新title的例子db.Update("articles", "article_id", new { title="New title" }, 123);

装饰你的Poco

// Represents a record in the "articles" table[PetaPoco.TableName("articles")][PetaPoco.PrimaryKey("article_id")]public class article{public long article_id { get; set; }public string title { get; set; }public DateTime date_created { get; set; }public bool draft { get; set; }public string content { get; set; }}

这样就可以简化操作

// Insert a recordvar a=new article();a.title="My new article";a.content="PetaPoco was here";a.date_created=DateTime.UtcNow;db.Insert(a);// Update ita.content="Blah blah";db.Update(a);// Delete itdb.Delete(a);

当然也可以这样运行

// Delete an articledb.Delete
("WHERE article_id=@0", 123);// Update an articledb.Update
("SET title=@0 WHERE article_id=@1", "New Title", 123);

也可以忽略某些属性

public class article{    [PetaPoco.Ignore]    public long SomeCalculatedFieldPerhaps    {         get; set;     }}

使用事务

using (var trans =db.getTransaction()){    // Do transacted updates here    // Commit    trans.Complete();}

SQL Builder

var id=123;var sql=PetaPoco.Sql.Builder    .Append("SELECT * FROM articles")    .Append("WHERE article_id=@0", id);if (start_date.HasValue)    sql.Append("AND date_created>=@0", start_date.Value);if (end_date.HasValue)    sql.Append("AND date_created<=@0", end_date.Value);var a=db.Query
(sql);

也可以使用名字命名:

sql.Append("AND date_created>=@start AND date_created<=@end",     new     {         start=DateTime.UtcNow.AddDays(-2),         end=DateTime.UtcNow     };);

 

也可以这样使用

var sql=PetaPoco.Sql.Builder()    .Select("*")    .From("articles")    .Where("date_created < @0", DateTime.UtcNow)    .OrderBy("date_created DESC");

 

sql使用where in 语法可以这样

var tagsToFind = new string[] { "SqlServer", "IIS" };var sql = PetaPoco.Sql.Builder.Select("*").From("Tags").Where("Name in (@tags)", new { tags = tagsToFind });var result = db.Query
(sql);

生成的sql如下

select * from Tags where name in (@0, @1);@0 = SqlServer, @1 = IIS

 

 

 

转载于:https://www.cnblogs.com/shiningplus/p/6848991.html

你可能感兴趣的文章
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
ubuntu终端一次多条命令方法和区别
查看>>
python之偏函数
查看>>
vnpy学习_06回测结果可视化改进
查看>>
读书笔记_量化交易如何建立自己的算法交易01
查看>>
设计模式03_工厂
查看>>
设计模式04_抽象工厂
查看>>
设计模式05_单例
查看>>
设计模式06_原型
查看>>
设计模式07_建造者
查看>>
设计模式08_适配器
查看>>
设计模式09_代理模式
查看>>
设计模式10_桥接
查看>>
设计模式11_装饰器
查看>>
设计模式12_外观模式
查看>>
设计模式13_享元模式
查看>>