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