在上次的文章中簡單介紹了 [Reface.NPI] 中的功能。 本期,將對這方法名稱解析規則進行詳細的解釋和說明, 以便開發者可以完整的使用 [Reface.NPI] 中的各種功能。 基本規則 方法名稱以 Insert , Delete , Select , Update 開頭 方法名以數個單詞構成 ...
在上次的文章中簡單介紹了 Reface.NPI 中的功能。
本期,將對這方法名稱解析規則進行詳細的解釋和說明,
以便開發者可以完整的使用 Reface.NPI 中的各種功能。
基本規則
- 方法名稱以 Insert , Delete , Select , Update 開頭
- 方法名以數個單詞構成,關鍵字、欄位、操作符、參數名都是一個單詞
- 每個單詞以大寫開頭,其餘全小寫
- UserName 會被認作兩個單詞
- Username 會被認作一個單詞
- 使用入參填充 Sql參數 時,不計大小寫,你可以用 id 填充 @Id 的值
1 Insert 規則
僅使用 Insert 將使用實體中的所有欄位的值寫入。
void Insert(Entity entity);
開發者也可以通過 Without 關鍵字排除一些欄位的寫入,特別是那些依賴資料庫本身的欄位。
下麵的例子不會對 Id 和 CreateTime 欄位寫入
bool InsertWithoutIdCreatetime(User user);
2 Delete 規則
Delete 方法名包含一個 條件規則。
條件規則 允許開發者定義一個 where 子語。
2.1 使用 By 聲明一個 條件規則
要在方法名中聲明一個條件,必須以 By 作為開始。
下麵的方法,將會生成 where Id = @Id , 並以入參的 id 作為 @Id 的值。
void DeleteById(int id);
2.2 使用 And 和 Or 合併多個條件
你也可以使用 And 和 Or 合併多個條件
下麵兩個方法將會生成 where Id = @Id and/or Name = @Name 並以入參的 id 和 name 分別作用 @Id 和 @Name 的值。
bool DeleteByIdAndName(int id, string name)
bool DeleteByIdOrName(int id, string name)
註意
- 因為沒有想到一個好的方法可以對條件進行分組,所以目前不可以聲明條件組,形如 where ( Id = @Id and Name = @Name ) or ( State = @State and Loginname = @Loginname )。
如果您有好的想法,您也可以告訴我,共同完善 Library 。非常期待您的分享,感謝!
2.3 更多的操作符
很明顯,我們不可能總是用 = 作為條件的判斷操作,
我們還有 大於,小於,Like等等。
你可以在欄位名後面加上操作符來實現此功能。
下麵的例子會生成 where Name Like @Name 的條件。
int DeleteByNameLike(string name)
目前系統中支持的操作符有
Sql | Method |
---|---|
= | Is , Equal , Equals |
> | Greaterthan , Gt |
>= | Greaterthanandequals , Gteq |
< | Lessthan , Lt |
<= | Lessthanandequals , Lteq |
Like | Like , Likes |
In | In |
2.4 自定義參數名
在上面的例子中,參數名直接與欄位名相同。
我們也可以在操作符後加上參數名來改名這個預設的參數名。
下麵的例子會生成 where Password Like @Badpassworda Or Password Like @Badpasswordb
int DeleteByPasswordLikeBadpasswordaOrPasswordLikeBadpasswordb(string badPasswordA, string badPasswordB);
3 Update 規則
Update 規則由兩個部分組成
- 條件規則 ( 與 Delete 規則相同)
- Set 規則
Set 規則
3.1 指定 set 的欄位
Update 關鍵字後接的部分,一直到 By 之前,都是 Set 的欄位。
下麵的例子會生成 set Password = @Password where Id = @Id
void UpdatePasswordById(int id, string password);
3.2 多個 set
你可以用 And 連接多個 set。
下麵的例子會生成 set Password = @Password , Changingtime = @Changingtime where Id = @Id。
bool UpdatePasswordAndChangingtimeById(int id, string password, DateTime changingTime);
3.3 自定義 set 參數
和 條件規則 一樣,生成的語句中,會預設使用欄位名作為參數名。
你也可以在欄位後添加 Equals 再加上 參數名稱 來自定義參數名。
下麵的例子會生成 set Count = @Newcount where Id = @Id And Count = @Oldcount
int UpdateCountEqualsNewcountByIdAndCountIsOldcount(int id, int oldCount, int newCount);
3.4 不指定 set 子句
當沒有 set 子句的時候,
會以排除了 By 子句的條件後的所有欄位作為 set 子句。
下麵的例子會生成 update [user] set name = ?, password = ? where id = ?
// User : Id, Name, Password
int UpdateById(int id, User user);
若表中還有一些欄位在 Update 時即不是條件,也不打算更新。可以使用 Without 關鍵字指定。
下麵的例子中,User 包含四個屬性
- Id
- Name
- Password
- CreateTime
// 下麵的語句不會對 CreateTime 進行更新
void UpdateWithoutCreatetimeById(int id, User user);
4 Select 規則
Select規則 包含以下三個規則
- 條件規則 ( 與 Delete 和 Update 相同 )
- 輸出欄位規則
- 排序規則
- 分頁查詢
4.1 輸出欄位
這個規則比較簡單,
只要把欄位列在 Select 後即可,
多個欄位可以用 And 連接。
輸出欄位是可選的,你可以跳過這個部分直接編寫條件。
IList<Entity> SelectIdAndNameAndCreatetime();
4.2 條件規則
與 Update 和 Delete 一樣,使用 By 關鍵字開始條件子句
User SelectById(int id);
4.3 排序規則
4.3.1 Orderby 子句
排序規則是由關鍵字 Orderby 開頭的 ( 除了 O 都是 小寫 )。
下麵的例子會生成 ORDER BY Id Asc / Desc
IList<Entity> SelectOrderbyId();
IList<Eneity> SelectOrderbyIdDesc();
4.3.2 多個排序
多個排序不需要使用 And 連接,直接拼接即可。
IList<User> SelectOrderbyUsernameCreatetime();
4.3.3 分頁查詢
為 Select 方法前加上 Paging 就可以使用分頁查詢功能。
註意
- 使用分頁查詢時,必須提供類型為 Paging 的參數。
IList<Order> PagingSelectByCreatetimeGt(DateTime createTime);
使用基於 Reface.AppStarter 開發的 Reface.AppStarter.NPI 你可以不避手動創建代理類,
只需要通過構造函數註入那些實現了 NPI 的介面,就可以直接對資料庫進行增刪改查的操作了。
在後面的文章中,會介紹 Reface.AppStarter.NPI 的功能和使用方法。
關註公眾平臺【清水潭】,可以查閱更多資料