【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(3)公共基礎資料操作類 RepositoryBase
索引
簡述
今天我們寫一個基礎資料的操作類,如果裡面有大家不理解的地方,可採取兩種方式,第一:提出來,第二:會用就行。這個類呢我一般不去修改它,因為基礎操作類,大家也可以直接拷貝到自己的專案中。
專案準備
我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。
專案開始
一、建立介面 IRepository
我們在應用服務的Service類庫下面新建一個介面 IRepository
右擊Service類庫→新增→新建項→介面 名稱 IRepository
二、基礎操作的介面方法
不瞭解介面的朋友需要注意下,介面是個規範,是不需要方法體的,說的通俗點,有了介面如果被繼承肯定會有實現,這裡你只需要寫方法就行了,具體的方法是如何實現的我們不管,愛怎麼實現怎麼實現,我只是告訴你,你要是繼承我這個介面,那麼我這些方法你必須實現,而且要符合我規範。這就跟領導一條批示:你給我做個上傳圖片的方法,返回上傳成功或失敗。領導就是介面,你是實現類,你在這個領導下面幹活,就相當於你繼承了領導,那麼你必須要完成這個圖片上傳方法並且返回上傳結果,至於你是用網上的上傳方法呀還是自己寫個webservice啊還是用jquery外掛啊隨你,領導不關心你用什麼,他只關心你按照他的要求去實現這個方法。這樣不知道大家理解介面了不?
我們這個介面是公共基礎資料操作類,所以要有資料模型啊,模型說白了就是類,因為是通用的,所以我們這裡寫 T 並且標識 T 是個 Class
我們的Service類庫呢,如果按照三層架構來講,應該是資料管理層,既然是資料管理層,那麼我們就是操作資料模型的,我們新增Domain 資料模型的引用,並且我們可能用到一些公共的方法,所以我們也新增對Common公共幫助類庫的引用
上面我們講了,這是資料管理層,我們是要對資料進行操作的,公用類庫呢,我們提供多種資料管理的方式,我們再新增兩個庫引用 EntityFramework和EntityFramework.SqlServer
我們先來宣告幾個資料物件操作
下面,我們寫幾個介面方法
主要有 單模型操作 多模型操作 儲存過程操作 查詢多條資料 分頁查詢 ADO.NET增刪改查
有朋友看到這會罵街了,我擦,能不能直接貼程式碼,截圖幹嘛~~ 不要急,不要急,一定要有耐心~~
我是先貼圖,給大家有個大致的瞭解,程式碼肯定會貼出來的~~
單模型操作
1 #region 單模型操作 2 /// <summary> 3 /// 獲取實體 4 /// </summary> 5 /// <param name="id">主鍵</param> 6 /// <returns>實體</returns> 7 T Get(Expression<Func<T, bool>> predicate); 8 /// <summary> 9 /// 插入實體 10 /// </summary> 11 /// <param name="entity">實體</param> 12 /// <returns>ID</returns> 13 bool Save(T entity); 14 15 /// <summary> 16 /// 修改實體 17 /// </summary> 18 /// <param name="entity">實體</param> 19 bool Update(T entity); 20 /// <summary> 21 /// 修改或儲存實體 22 /// </summary> 23 /// <param name="entity">實體</param> 24 bool SaveOrUpdate(T entity, bool isEdit); 25 26 /// <summary> 27 /// 刪除實體 28 /// </summary> 29 int Delete(Expression<Func<T, bool>> predicate = null); 30 31 /// <summary> 32 /// 執行SQL刪除 33 /// </summary> 34 int DeleteBySql(string sql, params DbParameter[] para); 35 36 /// <summary> 37 /// 根據屬性驗證實體物件是否存在 38 /// </summary> 39 bool IsExist(Expression<Func<T, bool>> predicate); 40 41 /// <summary> 42 /// 根據SQL驗證實體物件是否存在 43 /// </summary> 44 bool IsExist(string sql, params DbParameter[] para); 45 #endregionView Code
多模型操作
1 #region 多模型操作 2 /// <summary> 3 /// 增加多模型資料,指定獨立模型集合 4 /// </summary> 5 int SaveList<T1>(List<T1> t) where T1 : class; 6 /// <summary> 7 /// 增加多模型資料,與當前模型一致 8 /// </summary> 9 int SaveList(List<T> t); 10 /// <summary> 11 /// 更新多模型,指定獨立模型集合 12 /// </summary> 13 int UpdateList<T1>(List<T1> t) where T1 : class; 14 /// <summary> 15 /// 更新多模型,與當前模型一致 16 /// </summary> 17 int UpdateList(List<T> t); 18 /// <summary> 19 /// 批量刪除資料,當前模型 20 /// </summary> 21 int DeleteList(List<T> t); 22 /// <summary> 23 /// 批量刪除資料,獨立模型 24 /// </summary> 25 int DeleteList<T1>(List<T1> t) where T1 : class; 26 #endregionView Code
儲存過程操作
1 #region 儲存過程操作 2 /// <summary> 3 /// 執行增刪改儲存過程 4 /// </summary> 5 object ExecuteProc(string procname, params DbParameter[] parameter); 6 /// <summary> 7 /// 執行查詢的儲存過程 8 /// </summary> 9 object ExecuteQueryProc(string procname, params DbParameter[] parameter); 10 #endregionView Code
查詢多條資料
1 #region 查詢多條資料 2 /// <summary> 3 /// 獲取集合 IQueryable 4 /// </summary> 5 IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate); 6 /// <summary> 7 /// 獲取集合 IList 8 /// </summary> 9 List<T> LoadListAll(Expression<Func<T, bool>> predicate); 10 /// <summary> 11 /// 獲取DbQuery的列表 12 /// </summary> 13 DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate); 14 /// <summary> 15 /// 獲取IEnumerable列表 16 /// </summary> 17 IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para); 18 /// <summary> 19 /// 獲取資料動態集合 20 /// </summary> 21 System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para); 22 /// <summary> 23 /// 採用SQL進行資料的查詢,並轉換 24 /// </summary> 25 List<T> SelectBySql(string sql, params DbParameter[] para); 26 List<T1> SelectBySql<T1>(string sql, params DbParameter[] para); 27 /// <summary> 28 /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體物件 29 /// </summary> 30 /// <typeparam name="TEntity">實體物件</typeparam> 31 /// <typeparam name="TOrderBy">排序欄位型別</typeparam> 32 /// <typeparam name="TResult">資料結果,一般為object</typeparam> 33 /// <param name="where">過濾條件,需要用到型別轉換的需要提前處理與資料表一致的</param> 34 /// <param name="orderby">排序欄位</param> 35 /// <param name="selector">返回結果(必須是模型中存在的欄位)</param> 36 /// <param name="IsAsc">排序方向,true為正序false為倒序</param> 37 /// <returns>實體集合</returns> 38 List<TResult> QueryEntity<TEntity, TOrderBy, TResult>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Expression<Func<TEntity, TResult>> selector, bool IsAsc) 39 where TEntity : class 40 where TResult : class; 41 /// <summary> 42 /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回Object物件 43 /// </summary> 44 /// <typeparam name="TEntity">實體物件</typeparam> 45 /// <typeparam name="TOrderBy">排序欄位型別</typeparam> 46 /// <param name="where">過濾條件,需要用到型別轉換的需要提前處理與資料表一致的</param> 47 /// <param name="orderby">排序欄位</param> 48 /// <param name="selector">返回結果(必須是模型中存在的欄位)</param> 49 /// <param name="IsAsc">排序方向,true為正序false為倒序</param> 50 /// <returns>自定義實體集合</returns> 51 List<object> QueryObject<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 52 where TEntity : class; 53 /// <summary> 54 /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回動態類物件 55 /// </summary> 56 /// <typeparam name="TEntity">實體物件</typeparam> 57 /// <typeparam name="TOrderBy">排序欄位型別</typeparam> 58 /// <param name="where">過濾條件,需要用到型別轉換的需要提前處理與資料表一致的</param> 59 /// <param name="orderby">排序欄位</param> 60 /// <param name="selector">返回結果(必須是模型中存在的欄位)</param> 61 /// <param name="IsAsc">排序方向,true為正序false為倒序</param> 62 /// <returns>動態類物件</returns> 63 dynamic QueryDynamic<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc) 64 where TEntity : class; 65 #endregionView Code
分頁查詢
1 #region 分頁查詢 2 3 /// <summary> 4 /// 通過SQL分頁 5 /// </summary> 6 /// <param name="sql"></param> 7 /// <param name="parameters"></param> 8 /// <param name="page"></param> 9 /// <returns></returns> 10 IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, PageCollection page); 11 IList<T> PageByListSql(string sql, IList<DbParameter> parameters, PageCollection page); 12 /// <summary> 13 /// 通用EF分頁,預設顯示20條記錄 14 /// </summary> 15 /// <typeparam name="TEntity">實體模型</typeparam> 16 /// <typeparam name="TOrderBy">排序型別</typeparam> 17 /// <param name="index">當前頁</param> 18 /// <param name="pageSize">顯示條數</param> 19 /// <param name="where">過濾條件</param> 20 /// <param name="orderby">排序欄位</param> 21 /// <param name="selector">結果集合</param> 22 /// <param name="isAsc">排序方向true正序 false倒序</param> 23 /// <returns>自定義實體集合</returns> 24 PageInfo<object> Query<TEntity, TOrderBy> 25 (int index, int pageSize, 26 Expression<Func<TEntity, bool>> where, 27 Expression<Func<TEntity, TOrderBy>> orderby, 28 Func<IQueryable<TEntity>, List<object>> selector, 29 bool IsAsc) 30 where TEntity : class; 31 /// <summary> 32 /// 對IQueryable物件進行分頁邏輯處理,過濾、查詢項、排序對IQueryable操作 33 /// </summary> 34 /// <param name="t">Iqueryable</param> 35 /// <param name="index">當前頁</param> 36 /// <param name="PageSize">每頁顯示多少條</param> 37 /// <returns>當前IQueryable to List的物件</returns> 38 Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize); 39 /// <summary> 40 /// 普通SQL查詢分頁方法 41 /// </summary> 42 /// <param name="index">當前頁</param> 43 /// <param name="pageSize">顯示行數</param> 44 /// <param name="tableName">表名/檢視</param> 45 /// <param name="field">獲取項</param> 46 /// <param name="filter">過濾條件</param> 47 /// <param name="orderby">排序欄位+排序方向</param> 48 /// <param name="group">分組欄位</param> 49 /// <returns>結果集</returns> 50 Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para); 51 /// <summary> 52 /// 簡單的Sql查詢分頁 53 /// </summary> 54 /// <param name="index"></param> 55 /// <param name="pageSize"></param> 56 /// <param name="sql"></param> 57 /// <returns></returns> 58 Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para); 59 /// <summary> 60 /// 多表聯合分頁演算法 61 /// </summary> 62 PageInfo Query(IQueryable query, int index, int pagesize); 63 #endregionView Code
ADO.NET增刪改查
1 #region ADO.NET增刪改查方法 2 /// <summary> 3 /// 執行增刪改方法,含事務處理 4 /// </summary> 5 object ExecuteSqlCommand(string sql, params DbParameter[] para); 6 /// <summary> 7 /// 執行多條SQL,增刪改方法,含事務處理 8 /// </summary> 9 object ExecuteSqlCommand(Dictionary<string, object> sqllist); 10 /// <summary> 11 /// 執行查詢方法,返回動態類,接收使用var,遍歷時使用dynamic型別 12 /// </summary> 13 object ExecuteSqlQuery(string sql, params DbParameter[] para); 14 #endregionView Code
我們引用的類庫和解決方案
1 using Common; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Common; 5 using System.Linq; 6 using System.Text; 7 using System.Data.Entity.Infrastructure; 8 using System.Data.Entity; 9 using System.Linq.Expressions;View Code
這裡是完整的IRepository.cs
1 using Common; 2 using System; 3 using System.Collections.Generic; 4 using System.Data.Common; 5 using System.Linq; 6 using System.Text; 7 using System.Data.Entity.Infrastructure; 8 using System.Data.Entity; 9 using System.Linq.Expressions; 10 11 namespace Service 12 { 13 /// <summary> 14 /// 所有的資料操作基類介面 15 /// add yuangang by 2016-05-09 16 /// </summary> 17 public interface IRepository<T> where T:class 18 { 19 #region 資料物件操作 20 /// <summary> 21 /// 資料上下文 22 /// </summary> 23 DbContext Context { get; } 24 /// <summary> 25 /// 資料上下文 26 /// </summary> 27 Domain.MyConfig Config { get; } 28 /// <summary> 29 /// 資料模型操作 30 /// </summary> 31 DbSet<T> dbSet { get; } 32 /// <summary> 33 /// EF事務 34 /// </summary> 35 DbContextTransaction Transaction { get; set; } 36 /// <summary> 37 /// 事務提交結果 38 /// </summary> 39 bool Committed { get; set; } 40 /// <summary> 41 /// 提交事務 42 /// </summary> 43 void Commit(); 44 /// <summary> 45 /// 回滾事務 46 /// </summary> 47 void Rollback(); 48 #endregion 49 50 #region 單模型操作 51 /// <summary> 52 /// 獲取實體 53 /// </summary> 54 /// <param name="id">主鍵</param> 55 /// <returns>實體</returns> 56 T Get(Expression<Func<T, bool>> predicate); 57 /// <summary> 58 /// 插入實體 59 /// </summary> 60 /// <param name="entity">實體</param> 61 /// <returns>ID</returns> 62 bool Save(T entity); 63 64 /// <summary> 65 /// 修改實體 66 /// </summary> 67 /// <param name="entity">實體</param> 68 bool Update(T entity); 69 /// <summary> 70 /// 修改或儲存實體 71 /// </summary>