第一个查询:
public class User { public int UserId { get;set; } public string Email { get;set; } } using (IDatabase db = new Database("connStringName")) { List<User> users = db.Fetch<User>("select userId, email from users"); }
注: Database
需要关闭连接(可以把它当做你的对象)。
这是通过将列名映射的属性的名称User
对象。匹配不区分大小写。没有使用映射(查询)。
映射
默认情况下不需要映射。如果不指定其属性将会假设 表名 是类名,主键是“ID”。
最常用的一些基本特性映射是:
-
[TableName]
需要一个“名称”参数,将被映射到表名。 -
[PrimaryKey]
表示表的主键列。多个键之间用逗号分隔。还有一个“增量”属性(AutoIncrement),用于指示是否将自动递增主键列例如标识列的SQL服务器。缺省为真。 -
[Column]
如果列名称不匹配的使用这种属性。 -
[Ignore]
此属性将被忽略,并且不被映射。 -
[ResultColumn]
结果列,这些属性将不被包括在插入或更新。注:需要被明确指定的SQL。它不会自动生成SQL。标记
为查询或计算 -
[ComputedColumn]标记为
计算列属性,但他们将会自动生成SQL。 -
[SerializedColumn]
(V3+)序列化的属性将序列化的数据的默认实现IColumnSerializer
。有npoco.jsonnet库允许您使用JsonNetColumnSerializer
。
demo:
[TableName("Users")] [PrimaryKey("UserId")] public class User { public int UserId { get;set; } [Column("emailAddress")] public string Email { get;set; } [ResultColumn] public string ExtraInfo { get;set; } [Ignore] public int Temp { get;set; } }
查询单个对象
从数据库中查询一个对象可以几种不同方法来完成。
通过ID
最简单的方式是使用 SingleById<T>()
方法。
IDatabase db = new Database("connStringName"); User u = db.SingleById<User>(3);
通过SQL
如果您不显式提供 字段 将自动为您生成 ,子句将随后附上。
User u = db.Single<User>("where emailaddress = @0", "email@domain.com"); or User u = db.Single<User>("select u.* from users u where emailaddress = @0", "email@domain.com");
这两种方法都有一个“ordefault”方法。如果您不确定对象是否存在的话,请使用这些方法。如果对象不存在,而且您没有使用到 ordefault 就会引发空引用异常。
还有 First<T>
和 FirstOrDefault<T>
如果有多条数据将抛出一个异常。如果不多于1个记录将返回结果。
插入,更新,删除
插入新记录
IDatabase db = new Database("connStringName"); User u = new User() { Email = "name@domain.com", LastLoggedIn = DateTime.UtcNow }; db.Insert(u);
更新记录
var user = db.SingleById(1); user.Email = "new@domain.com"; db.Update(user);
删除记录
var user = db.SingleById(1); db.Delete(user); or db.Delete<User>(1);
覆盖或新建记录
IDatabase db = new Database("connStringName"); User u = new User() { Email = "name@domain.com", LastLoggedIn = DateTime.UtcNow }; db.Save(u);
这样会插入一个新记录或更新一个现有记录。它是否存在是由主键确定的。
这个语句很危险,一定要确定你的对象里没有主键或主键不在数据库中
查询列表
获取所有:
List<User> users = db.Fetch<User>();
标准获取:
List<User> users = db.Fetch<User>("where isActive = 1");
使用SQL:
List<User> users = db.Fetch<User>("select u.* from users where u.isActive = 1");
懒惰模式
警告:以下方法Query<T>
使用生成的关键字。运行该查询的结果都j将被遍历。如果你不完全理解这一概念,请使用 Fetch<T>
。
List<User> users = db.Query<User>("select u.* from users where u.isActive = 1");
查询分页
主要有两种方法用于查询分页。
Page<T>
IDatabase db = new Database("connStringName"); Page<T> pagedUsers = db.Page<User>(2, 10, "select u.* from users u order by userid");
其中Page<T>
被定义为:
public class Page<T> { public long CurrentPage { get; set; } public long TotalPages { get; set; } public long TotalItems { get; set; } public long ItemsPerPage { get; set; } public List<T> Items { get; set; } }
注意:您必须在SQL语句中提供一个 order by 语句,以便查询知道您希望数据分页的顺序。
页面的第一个参数是页面编号。这个数字从第一个页面的1开始。第二个参数是页面的大小。在上面的示例中,将返回包含10个用户的第二个页面。
SkipTake<T>
SkipTake<T> 方法与在LINQ中跳过采取方法非常相似。它具有与页面< T >方法相同的参数数量,但第一个参数不是页码,而是跳过x个记录之后返回的记录数。第二个参数是记录的数量(即每页要取的记录数量)。为了返回与Page<T>方法相同的结果,查询将如下所示:
List<User> users = db.SkipTake<User>(10, 10, "select u.* from users u order by userid");
对事务的支持
示例1
using (IDatabase db = new Database("connStringName")) { db.BeginTransaction(); //Your CRUD operation here db.CompleteTransaction(); }
示例2
using (IDatabase db = new Database("connStringName")) { using (var transaction = db.GetTransaction()) { //你的CRUD操作在这里 transaction.Complete(); } }