目前使用這個框架,搜不到中文資料。 只有英文wiki,翻譯學習摘錄一下。 大部分是機翻的,改了一些地方, 因為博主也是低水平的,標紅的是瞎理解的。 可能會有錯誤的地方,如果有園友發現可以指出。 wiki地址:http://github.com/schotime/NPoco/wiki 第一個查詢: 註 ...
目前使用這個框架,搜不到中文資料。
只有英文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 }
查詢單個對象
從資料庫中查詢一個對象可以幾種不同方法來完成。
通過ID
最簡單的方式是使用 SingleById<T>()
方法。
1 IDatabase db = new Database("connStringName"); 2 User u = db.SingleById<User>(3);
通過SQL
下麵你可以看到,只有其中的規定。如果您不顯式提供選擇的條款將自動為您生成和在其中將隨後附上。
1 User u = db.Single<User>("where emailaddress = @0", "[email protected]"); 2 or 3 User u = db.Single<User>("select u.* from users u where emailaddress = @0", "[email protected]");
這兩種方法都有一個“ordefault”方法,如果您不確定對象的存在。如果它不存在,而且您沒有使用到 ordefault 就會引發異常。
還有 First<T>
和 FirstOrDefault<T>
如果有多條數據將拋出一個異常,如果不多於1個記錄將被返回。
插入,更新,刪除
插入新記錄
1 IDatabase db = new Database("connStringName"); 2 User u = new User() 3 { 4 Email = "[email protected]", 5 LastLoggedIn = DateTime.UtcNow 6 }; 7 8 db.Insert(u);
更新記錄
1 var user = db.SingleById(1); 2 user.Email = "[email protected]"; 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 = "[email protected]", 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");
查詢分頁
主要有兩種方法用於查詢分頁。
Page<T>
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>
SkipTake<T> 方法與在LINQ中跳過採取方法非常相似。它具有與頁面< T >方法相同的參數數量,但第一個參數不是頁碼,而是記錄的數量(即要取的記錄數量?)。第二個參數是跳過x個記錄之後返回的記錄數(即開始的位置?)。為了返回與Page<T>方法相同的結果,查詢將如下所示:
1 List<User> users = db.SkipTake<User>(10, 10, "select u.* from users u order by userid");
對事務的支持
Example 1
1 using (IDatabase db = new Database("connStringName")) 2 { 3 db.BeginTransaction(); 4 //Your CRUD operation here 5 db.CompleteTransaction(); 6 }
Example 2
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