PetaPoco http://www.toptensoftware.com/petapoco/

|PetaPoco is a tiny, fast, single-file micro-ORM for .NET and Mono.

PetaPoco 是一个小型轻巧的 ORM~

此扩展是为 PetaPoco 添加 Linq 调用用在自己写过的项目里感觉很舒服很流畅~

其实这个扩展发在 Github 上也有一段时间了就是一直介绍怎么用也就基本没人关注过这几天简单写了几个简单例子顺便就也发到园子里了~

开源地址:https://github.com/NetRube/NetRube.Data

NetRube.Data PetaPoco 扩展

PetaPoco extensions

基本用法请参照 http://www.toptensoftware.com/petapoco/

*需要调用 NetRube 基础库 https://github.com/NetRube/NetRube

查询

获取记录:

var a = db.Get<article>().FirstOrDefault();  // SELECT TOP(1) * FROM article
var a2 = db.Get<article>().Where(e => e.article_id > 3 && e.title.Contains("NetRube")).FirstOrDefault();
//var a3 = db.Get<article>().Where(e => e.article_id > 3).Where(e => e.title.Contains("NetRube")).FirstOrDefault();
var a4 = db.Get<article>().Where(e => e.article_id > 3 || e.title.Contains("NetRube")).FirstOrDefault();
//var a5 = db.Get<article>().Where(e => e.article_id > 3).WhereOr(e => e.title.Contains("NetRube")).FirstOrDefault();

Where 中 string 可以使用以下几个方法:

Contains("NetRube") --> LIKE '%NetRube%'

StartsWith("NetRube") --> LIKE 'NetRube%'

EndsWith("NetRube") --> LIKE '%NetRube'

获取指定字段:

var a = db.Get<article>().Select(e => e.article_id, e => e.title).FirstOrDefault();
// SELECT TOP(1) article_id, title FROM article

集合:

var ls = db.Get<article>().ToList();
var ls2 = db.Get<article>().Where(e => e.article_id > 3 && e.title.Contains("NetRube")).ToList();

排序:

var ls = db.Get<article>().OrderByDescending(e => e.date_created).ToList();
var ls2 = db.Get<article>().OrderByDescending(e => e.date_created, e => e.article_id).ToList();
var ls3 = db.Get<article>().OrderByDescending(e => e.date_created).OrderBy(e => e.article_id).ToList();

指定范围:

var ls = db.Get<article>().Take(10).Distinct().ToList();  // SELECT DISTINCT TOP(10) * FROM article
var ls2 = db.Get<article>().Where(e => e.article_id > 3).Skip(5).Take(10).ToList();

分页:

var pageIndex = 1, pageSize = 20;
var ls = db.Get<article>().Where(e => e.article_id > 3);
ls.Where(e => e.title.StartsWith("NetRube"));
ls.OrderByDescending(e => e.date_created);
var result = ls.ToPagedList(pageIndex, pageSize);

联合查询:

var ls = db.Get<article>().LeftJoin<author>((e, o) => e.author_id == o.id).Where<author>(o => o.name == "NetRube").ToList();
// 可以用 InnerJoin、LeftJoin、RightJoin

统计:

long count = db.Get<article>().Count<long>();
int count2 = db.Get<article>().Count();
var count3 = db.Get<article>(e => e.article_id > 3).Count();
var count4 = db.Get<article>().Where(e => e.article_id > 3).Count();
long sum = db.Get<article>().Sum<long>(e => e.xx);
int sum2 = db.Get<article>().Sum(e => e.xx);
// Max()、Min() 用法一样

Exist:

var e = db.Get<article>().Where(e => e.article_id == 3).Exist();

插入

var a = new article();
a.title = "My new article";
a.content = "PetaPoco was here";
a.date_created = DateTime.UtcNow;
bool s = db.Add<article>(a); // 是否插入成功
long id = db.Add<long>(a); // 返回插入成功后的 id 号

更新

var n = db.Set<article>().Set(e => e.title, "NetRube").Where(e => e.article_id == 1).Execute(); // 返回受影响记录数
// UPDATE article SET title = "NetRube" WHERE article_id = 1
var s = db.Set<article>().Set(e => e.hits, e.hits + 1).Where(e => e.article_id == 1).Succeed(); // 是否更新成功
// UPDATE article SET hits = hits + 1 WHERE article_id = 1

按需更新

var a = db.Get<article>().Where(e => e.article_id == 1).FirstOrDefault();
var ss = NetRube.TrackingEntity<article>.Start(a); // 跟踪实体变化
a.title = "NetRube"; // 如果原实体 title 不等于 "NetRube" 将会更新此字段,如果跟原值一样将不会更新,没有重新赋值的字段也将不会更新
db.Set<article>(ss).Where(e => e.article_id == 1).Execute();

删除

var n = db.Del<article>().Where(e => e.article_id == 1).Execute(); // 返回受影响记录数
var s = db.Del<article>().Where(e => e.article_id == 1).Succeed(); // 是否删除成功

事务

var s = db.InTransaction(() => {
db.Add...
db.Set...
}); var s2 = db.InTransaction(() => {
db.Add...
var s = db.Set...
if (s)
return true;
return false;
}); // 返回 false 时会导致整个嵌套的事务全部回滚

高级用法

一对多、多对一、多对多映射:

Map() 映射方法参考:http://www.toptensoftware.com/Articles/115/PetaPoco-Mapping-One-to-Many-and-Many-to-One-Relationships

var authors = new Dictionary<long, author>();
var posts = db.Get<post>()
.LeftJoin<author>((e, o) => e.author == o.id)
.Map<post, author>((p, a) =>
{
// Get existing author object
author aExisting;
if (authors.TryGetValue(a.id, out aExisting))
a = aExisting;
else
authors.Add(a.id, a);
// Wire up objects
p.author_obj = a;
return p;
})
.OrderBy(e => e.id)
.ToList(); author current;
var ls = db.Get<author>()
.LeftJoin<post>((a, p) => a.id == p.author)
.Map<author, post>((a, p) =>
{
if (a == null) return current;
if (current != null && current.id == a.id)
{
current.posts.Add(p);
return null;
}
var prev = current;
current = a;
current.posts = new List<post>();
current.posts.Add(p);
return prev;
})
.OrderBy(e => e.id)
.ToList();

In_查询:

 var ids = new List<int>() { 1, 2, 3, 4 };
var ls = db.Get<author>().Where(e => e.id.In_(ids)).ToList(); var pids = db.Get<post>().Select(e => e.id).Where(e => e.id < 10); // 最后不要调用 ToList()
var ls = db.Get<author>().Where(e => e.id.In_(pids)).ToList(); // In_() 里将调用 pids 生成的 SQL 语句

在上面所有的例子中 db.Get/Set/Add/Del 到最后的执行方法(FirstOrDefault()、ToList()、Count()、Execute()等)之间的 Where、OrderBy、LeftJoin、Set、Select等等都可以以任意次序和次数调用,如:

var ls = db.Get<article>()
.OrderBy(e => e.date_created)
.Where(e => e.article_id > 3)
.Select(e => e.article_id)
.OrderByDescending(e => e.article_id)
.Where(e => e.title.Contains("NetRube"))
.Select(e => e.title)
.ToList(); // 最后调用执行方法

整条语句也可以任意分成几段,同理,只要在最后调用执行方法就可以了:

var ls = db.Get<article>().OrderBy(e => e.date_created);
ls.Where(e => e.article_id > 3).Select(e => e.article_id);
var title = Request("title");
if(!string.IsNullOrEmpty(title))
ls.Where(e => e.title.Contains(title));
ls.OrderByDescending(e => e.article_id)
.Select(e => e.title);
var result = ls.ToList(); // 最后调用执行方法

开源 PetaPoco 扩展~一个小型轻巧的ORM~的更多相关文章

  1. (原创)发布一个C++版本的ORM库SmartDB(一)

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

  2. 发布一个C++版本的ORM库SmartDB

    先简单说说ORM的优点: 提高开发效率,减少重复劳动,只和业务实体打交道,由业务实体自动生成sql语句,不用手写sql语句. 简单易用, 可维护性好. 隔离数据源,使得我们更换数据源时不用修改代码. ...

  3. MSYS是一个小型的GNU环境,包括基本的bash,make等等,与Cygwin大致相当(双击“D:\MinGW\msys\1.0\msys.bat”,启动MinGW终端)

    1 简介   MinGW,是Minimalist GNUfor Windows的缩写.它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和 ...

  4. Gora是一个类似Hibernate的ORM框架

    Gora是一个类似Hibernate的ORM框架,但是不只是支持关系数据库,更重要支持NoSQL之类大数据的存储. 支持NoSQL之类大数据的存储 Apache Gora是一个开源的ORM(Objec ...

  5. 利用ELK构建一个小型的日志收集平台

    利用ELK构建一个小型日志收集平台 伴随着应用以及集群的扩展,查看日志的方式总是不方便,我们希望可以有一个便于我们查询及提醒功能的平台:那么首先需要剖析有几步呢? 格式定义 --> 日志收集 - ...

  6. 我是怎么开发一个小型java在线学习网站的

    2016/1/27 11:55:14 我是怎么开发一个小型java在线学习网站的 一直想做一个自己的网站(非博客),但是又不知道做什么内容的好,又一次看到了w3schools,就萌发了开发一个在线ja ...

  7. 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce

    今天一大早来看到园友分享的福利<分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi>,我也来分享一个吧.以下内容由笔者写 ...

  8. 抛弃EF,20分构建一个属于自己的ORM框架

    Poiuyt_cyc 博客园首页新随笔联系订阅管理随笔 - 11  文章 - 0  评论 - 111 抛弃EF,20分构建一个属于自己的ORM框架 相信EF大家都不陌生了,因为数据库表跟程序实体是一一 ...

  9. ZYThumbnailTableView---堪比一个小型阅读App

    Demo github地址: https://github.com/liuzhiyi1992/ZYThumbnailTableView 原文地址:http://zyden.vicp.cc/zythum ...

随机推荐

  1. 手机(Android)资源

    手机型号 API Android版本   Lenovo A238t API 10 2.3.5   华为 P7 API 19 4.4.2                  

  2. 堆和索引堆的实现(python)

    ''' 索引堆 ''' ''' 实现使用2个辅助数组来做.有点像dat.用哈希表来做修改不行,只是能找到这个索引,而需要change操作 还是需要自己手动写.所以只能用双数组实现. #引入索引堆的核心 ...

  3. 通过flask中的Response返回json数据

    使用flask的过程中,发现有时需要生成一个Response并返回.网上查了查,看了看源码,找到了两种办法: from flask import Response, json Response(jso ...

  4. Windows-universal-samples学习笔记系列三:Navigation

    Navigation Back Button Master/detail Navigation menu (XAML) Pivot Projection XHR, handling navigatio ...

  5. Java中TreeMap的基本操作

    TreeSet有四种种构造函数可以初始化 在代码中主要列出了常用的三种: 构造方法摘要 TreeSet()           构造一个新的空 set,该 set 根据其元素的自然顺序进行排序. Tr ...

  6. mybatis学习八 事物

    1.事物的定义: 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源. 2,事物的特性: ...

  7. unity3DGI

    Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...

  8. 812. Largest Triangle Area

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  9. 2019.01.23 ural1519 Formula 1(轮廓线dp)

    传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...

  10. C++中string的使用

    概述 这篇博文为了记录C++中string的使用,用到一点补充一点. 预备 使用string之前需要包含头文件 #include<iostream> #include<string& ...