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

.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" table
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; }
}

查询

// Create a PetaPoco database object
var db=new PetaPoco.Database("connectionStringName");// Show all articles 
foreach (var a in db.Query<article>("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<long>("SELECT Count(*) FROM articles");

返回单条记录

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

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

分页查询

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

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

会返回

public class Page<T> 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<T> Items { get; set; }
}

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

返回匹配的所有总记录数.
得到需要的页数的字记录数.

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

新增,更新,删除记录
新增

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

更新

// Get a record
var a=db.SingleOrDefault<article>("SELECT * FROM articles WHERE article_id=@0", 123);
// Change it
a.content="PetaPoco was here again";
// Save it
db.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 record
var a=new article();
a.title="My new article";
a.content="PetaPoco was here";
a.date_created=DateTime.UtcNow;
db.Insert(a);// Update it
a.content="Blah blah";
db.Update(a);// Delete it
db.Delete(a);

当然也可以这样运行

// Delete an article
db.Delete<article>("WHERE article_id=@0", 123);// Update an article
db.Update<article>("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<article>(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<Tag>(sql);

生成的sql如下

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

 

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql错误Please use SHOW DDL to check it, and then recover or rollback it using RECOVER DDL or ROLLBAC

Please use SHOW DDL to check it, and then recover or rollback it using RECOVER DDL or ROLLBACK DDL, mysql执行DDL语句的时候提示错误&#xff1a; [Err] 4644 - [1065507aa5d0c000][10.0.85.135:3306][test]ERR-CODE: [TDDL-4644][ERR_PENDING_DDL_JOB_EXISTS] Anoth…

计算机网络读后感500字,《网络少年》观后感500字作文

我还 觉得我们应该像索拉拉老师那样正确使用电脑&#xff0c;利用它来帮助我们学习、工作&#xff0c;利用它来充实生活&#xff0c;寻找乐趣&#xff0c;而不是单纯地利用它来玩电脑游戏。下面是小编为你们整理的几篇文章&#xff0c;希望你们喜欢阅读。《网络少年》观后感500…

Blog小技巧之二-让朋友在Blog上也能QQ到自己

首先打开“[url]http://is.qq.com/cgi-bin/webpresence/wpa_code?uin123456789[/url]”&#xff0c;把上面的123456789换成对方的QQ号。 然后选择想要的会话图片和提示。在“点击生成代码”中我们选择生成网页代码&#xff0c;这时我们可以得到一段网页代码&#xff0c;把它粘…

Linux中常见目录的作用

bin目录 有四个bin目录&#xff0c;分别是/bin、/sbin、/usr/bin/、/usr/sbin/  用来保存系统命令&#xff0c;区别是 前两个目录下的命令所有用户都可以执行&#xff0c;后两个目录下的命令只有超级用户可以执行boot目录 启动目录&#xff0c;保存的是用户的启动数据dev目录…

springboot 设置server.port不失效原因

配置服务启动的端口时&#xff0c;springboot默认在application.properties配置文件中提供了server.port配置项,但是启动后没有生效&#xff0c;其实该配置项要想生效其实是依赖于项目中内嵌的tomcat容器 内嵌tomcat的jar包依赖包含在pom中 <dependency><groupId>o…

计算机科学学院陈瑜,浙江大学城市学院计算机与计算科学学院 计算机科学与技术 陈则伦...

陈则伦省级优秀毕业生计算机1202所获奖项及荣誉&#xff1a;国家奖学金、学业优秀二等奖学金、学科竞赛优秀奖学金(团体一等)、学院“三好学生”荣誉称号、学业优秀二等奖学金2次、学科竞赛优秀奖学金(团体一等)、学科竞赛个人优秀二等奖学金2次、学院“三好学生”荣誉称号学科…

gcc对C语言的扩展:局部标签声明(Locally Declared Labels)

每个语句内嵌表达式都是一个可以声明局部跳转标签的域。一个局部标签只是一个标识符&#xff1a;你可以使用通常的goto语句跳到它&#xff0d;&#xff0d;但是只能在它所属的域内这么做。一个局部标签的申明如下&#xff1a;__label__ label;或者&#xff1a;__label__ label1…

界限设置

进行完第2步后在新打开的图层中输入limits 回车 输入坐标0&#xff0c;0 回车 输入界面长宽按坐标的方式输入&#xff0c;如297&#xff0c;210 然后回车&#xff1b;按F7可以显示和关闭格子 转载于:https://www.cnblogs.com/2277098974-qqcom/p/6853829.html

com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFoundError: org/apache/poi/p

今天用 今天用easyexcel遇到这个报错 com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFoundError: org/apache/poi/p 我用的是2.2.6版本 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId…

计算机专业的大学生活演讲稿,大学生演讲稿3到5分钟

3大学生演讲稿3到5分钟篇二尊敬的领导老师&#xff0c;亲爱的同学们&#xff1a;大家晚上好&#xff0c;我是来自会计院20XX级会计电算化5班的李晓丹&#xff0c;很荣幸这天有机会站在那里作为出色学生代表与大家交流我的学习故事。相信在我的故事里也必须有不少在坐的同学们身…

mac Pycharm安装和激活

Pycharm 是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理&#xff0c;代码跳转&#xff0c;只能提示&#xff0c;自动完成&#xff0c;单元测试、脚本控制。此外&#xff0c;该IDE提供了一些高级功…

HP前女老板Dunn和Carly的琐碎事

HP是美国的一家综合的IT技术公司,它生产的打印机和各式电脑产品在中国可谓是家喻户晓。领导这家跨国技术集团公司的&#xff0c;曾经有过两位出名的女老板&#xff0c;她们是1999-2005在位的Carly Fiorina女士&#xff0c;以及2005-2006年在位的Patricia Dunn女士。 前者因为参…

计算机术语设备透明性,计算机中术语透明性是什么意思?

一、透明性(transparency)定义&#xff1a;在通信网中&#xff0c;不改变信号形式和信息内容的端到端传输。二、透明性现象&#xff1a;在计算机技术中&#xff0c;一种本来是存在的事物或属性&#xff0c;但从某个角度看似乎不存在&#xff0c;称为透明性现象。通常&#xff0…

C/S和B/S

一、什么是C/S和B/S 要想对“C/S”和“B/S”技术发展变化有所了解&#xff0c;首先必须搞清楚三个问题。 第一、什么是C/S结构。 C/S&#xff08;Client/Server&#xff09;结构&#xff0c;即大家熟知的客户机和服务器结构。它是软件系统体系结构&#xff0c;通过它可以充分利…

tostring、(string)和 String.valueOf()

上周遇到一个问题&#xff0c;只怪自己平时没注意这个细节&#xff0c;从数据库取数据在map集合里&#xff0c;取出该值是我用了.tostring的方法&#xff0c;一次在当取出数据为空时代码报java.lang.NullPointerException空指针异常。而另外一个同时平时习惯行使用&#xff08;…

基于使用AspectJ实现AOP,注解AOP开发(基于xml文件、基于注解)

AOP概念 AOP是Aspect Oriented Programming的缩写&#xff0c;即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思想&#xff0c;OOP&#xff0c;即『面向对象编程』&#xff0c;它提倡的是将功能模块化&#xff0c;对象化&#xff0c;而AOP的思想&#xff0c;则不太…

湖北大学 计算机考研,湖北大学考研难吗?一般要什么水平才可以进入?

问&#xff1a;从湖北大学毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;想要了解湖北大学更多毕业生就业情况见>>>湖北大学总之&#xff0c;湖北大学就业率相对来说是比较良好的&#xff0c;如果大家对此学校感兴趣的话&#xff0c;可以大胆备考&#xf…

手机被锁在耳机模式了

我的多普达575昨晚突然被锁在耳机模式中&#xff0c;怎么也恢复不到正常模式。后来一急&#xff0c;干脆恢复出厂设置。天啦&#xff0c;还是不行。幸亏这是智能手机&#xff0c;所有的资料都备份在我的电脑上。最后上网查查&#xff0c;原来是因为耳机孔中的弹簧没有复位。问同…

python PIL图像处理

新建图像 # 三个参数分别代表图像的模式&#xff1a;常用的为RGB(3通道) 、RGBA(4通道为透明通道&#xff0c;0为完全透明&#xff0c; 256为不透明) # 第二个参数为图像的长宽参数 # 第三个为默认的填充颜色&#xff0c;RGB时长度为3&#xff0c;RGBA是长度为4 img Image.new(…