1. 程式人生 > >【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(3)公共基礎資料操作類 RepositoryBase

【無私分享:從入門到精通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         #endregion
View 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         #endregion
View 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         #endregion
View 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         #endregion
View 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         #endregion
View 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         #endregion
View 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>