文章出處

前面已經介紹了新增/修改/刪除了, 接下來介紹一下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語句拼接而成, 那么就可以讀取多次以獲取多個查詢結果


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()