开源 PetaPoco 扩展~一个小型轻巧的ORM~
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
var a2 = db.Get
//var a3 = db.Get
var a4 = db.Get
//var a5 = db.Get
Where 中 string 可以使用以下几个方法:
Contains("NetRube") --> LIKE '%NetRube%'
StartsWith("NetRube") --> LIKE 'NetRube%'
EndsWith("NetRube") --> LIKE '%NetRube'
获取指定字段:
var a = db.Get
// SELECT TOP(1) article_id, title FROM article
集合:
var ls = db.Get
var ls2 = db.Get
排序:
var ls = db.Get
var ls2 = db.Get
var ls3 = db.Get
指定范围:
var ls = db.Get
var ls2 = db.Get
分页:
var pageIndex = 1, pageSize = 20;
var ls = db.Get
ls.Where(e => e.title.StartsWith("NetRube"));
ls.OrderByDescending(e => e.date_created);
var result = ls.ToPagedList(pageIndex, pageSize);
联合查询:
var ls = db.Get
// 可以用 InnerJoin、LeftJoin、RightJoin
统计:
long count = db.Get
int count2 = db.Get
var count3 = db.Get
var count4 = db.Get
long sum = db.Get
int sum2 = db.Get
// Max()、Min() 用法一样
Exist:
var e = db.Get
插入
var a = new article();
a.title = "My new article";
a.content = "PetaPoco was here";
a.date_created = DateTime.UtcNow;
bool s = db.Add
long id = db.Add
更新
var n = db.Set
// UPDATE article SET title = "NetRube" WHERE article_id = 1
var s = db.Set
// UPDATE article SET hits = hits + 1 WHERE article_id = 1
按需更新
var a = db.Get
var ss = NetRube.TrackingEntity
a.title = "NetRube"; // 如果原实体 title 不等于 "NetRube" 将会更新此字段,如果跟原值一样将不会更新,没有重新赋值的字段也将不会更新
db.Set
删除
var n = db.Del
var s = db.Del
事务
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
.LeftJoin
.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
.LeftJoin
.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
current.posts.Add(p);
return prev;
})
.OrderBy(e => e.id)
.ToList();
In_查询:
var ids = new List
var ls = db.Get
var pids = db.Get
var ls = db.Get
在上面所有的例子中 db.Get/Set/Add/Del 到最后的执行方法(FirstOrDefault()、ToList()、Count()、Execute()等)之间的 Where、OrderBy、LeftJoin、Set、Select等等都可以以任意次序和次数调用,如:
var ls = db.Get
.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
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(); // 最后调用执行方法

浙公网安备 33010602011771号