標籤:ini 繼承 mat convert manage empty 自訂 multiple mit
前面已經介紹了新增/修改/刪除了, 接下來介紹一下Rainbow的Read方法.
一、Read -- Rainbow原生
1. 先看測試代碼
var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();using (var conn = new MySqlConnection(conStr)){ var db = Rainbow.Init(conn, 2000); //Rainbow提供方法 var entity = db.Teacher.Get(8); entity = db.Teacher.First(); var listAll = db.Teacher.All();}
Rainbow在讀取資料這一塊, 就只提供了這幾個方法, 當然, Dapper的方法, 在這裡仍然是可以用的, 通過db.Query的方式就可以用了
2. 源碼解析
/// <summary>/// Grab a record with a particular Id from the DB /// </summary>/// <param name="id"></param>/// <returns></returns>public T Get(TId id){ return database.Query<T>("select * from " + TableName + " where " + "Id" + " = @id", new { id }).FirstOrDefault();}public virtual T First(){ return database.Query<T>("select * from " + TableName + " LIMIT 1;").FirstOrDefault(); //return database.Query<T>("select top 1 * from " + TableName).FirstOrDefault();}public IEnumerable<T> All(){ return database.Query<T>("select * from " + TableName);}
First方法需要作出修改, 以適應mysql. 不過First方法是虛方法, 在沒有源碼修改的情況下, 可以用類去繼承重寫就可以了, 也還是比較方便的.有源碼的話, 更方便點
這裡的幾個封裝都是非常簡單的, 近乎於赤裸裸的sql了, 不在多說
二、自訂擴充
1. 測試代碼:
var conStr = ConfigurationManager.ConnectionStrings["Cons"].ToString();using (var conn = new MySqlConnection(conStr)){ var db = Rainbow.Init(conn, 2000); //自訂擴充方法 var list = db.Teacher.GetListBy(" No>@No", new { No = 6060 }); var pageList = db.Teacher.GetPageList(1, 10, " No>@No", new { No = 6060 });}
經測試, 是可以正常使用的. 接下來看一下代碼
2. 自訂方法
/// <summary>/// 根據條件查詢/// </summary>/// <param name="whereStr">不帶where關鍵字</param>/// <returns></returns>public IEnumerable<T> GetListBy(string whereStr, dynamic param = null){ string sql = "select * from " + TableName; if (!string.IsNullOrWhiteSpace(whereStr)) sql += " where " + whereStr; return database.Query<T>(sql, param);}
此處的方法, 只適用於單表, 對於多表的查詢, 可以直接使用Dapper的方法, 寫sql.
/// <summary>/// 分頁方法/// </summary>/// <param name="pageIndex">當前頁碼</param>/// <param name="pageSize">每頁顯示條數</param>/// <param name="whereCondition">where條件</param>/// <param name="param">where條件中的參數列表</param>/// <param name="orderbyProperty">排序欄位;如 name DESC 或者 id DESC,name ASC</param>/// <returns></returns>public virtual PagedResult<T> GetPageList(int pageIndex, int pageSize, string whereCondition = "", dynamic param = null, string orderbyProperty = ""){ if (pageIndex < 1) pageIndex = 1; var startItem = (pageIndex - 1) * pageSize; string where = string.IsNullOrEmpty(whereCondition) ? "" : " WHERE " + whereCondition; string orderby = string.IsNullOrEmpty(orderbyProperty) ? "" : " ORDER BY " + orderbyProperty; string sql = string.Format(@"SELECT * FROM {0} {1} {2} LIMIT {3},{4}; SELECT COUNT(1) FROM {0} {1}", TableName, where, orderby, startItem, pageSize); PagedResult<T> pagingResult = new PagedResult<T>(pageSize, pageIndex); using (var result = database.QueryMultiple(sql, param)) { List<T> list = result.Read<T>(); var totalCount = Convert.ToInt32(result.Read<long>()[0]); pagingResult.Data = list; pagingResult.TotalItemCount = totalCount; } return pagingResult;}
這個就是單表的分頁方法了, 如果想要多表的, 只需要稍微修改下這個方法, 就可以了. 就不貼了.
這裡牽涉到一個QueryMultiple方法, 是之前Dapper解析篇幅裡面沒有提到的, 這個方法是分次查詢, 如果sql語句是多個sql語句拼接而成, 那麼就可以讀取多次以擷取多個查詢結果
Dapper學習 - Dapper.Rainbow(三) - Read