前面已經介紹了新增/修改/刪除了, 接下來介紹一下Rainbow的Read方法. 一、Read -- Rainbow原生 1. 先看測試代碼 Rainbow在讀取數據這一塊, 就只提供了這幾個方法, 當然, Dapper的方法, 在這裡仍然是可以用的, 通過db.Query的方式就可以用了 2. 源 ...
前面已經介紹了新增/修改/刪除了, 接下來介紹一下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語句拼接而成, 那麼就可以讀取多次以獲取多個查詢結果