【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(3)公共基礎數據操作類 RepositoryBase


索引

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 目錄索引

簡述

今天我們寫一個基礎數據的操作類,如果里面有大家不理解的地方,可采取兩種方式,第一:提出來,第二:會用就行。這個類呢我一般不去修改它,因為基礎操作類,大家也可以直接拷貝到自己的項目中。

項目准備

我們用的工具是: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>
 72         /// <param name="entity">實體</param>
 73         bool SaveOrUpdate(T entity, bool isEdit);
 74 
 75         /// <summary>
 76         /// 刪除實體
 77         /// </summary>
 78         int Delete(Expression<Func<T, bool>> predicate = null);
 79 
 80         /// <summary>
 81         /// 執行SQL刪除
 82         /// </summary>
 83         int DeleteBySql(string sql, params DbParameter[] para);
 84 
 85         /// <summary>
 86         /// 根據屬性驗證實體對象是否存在
 87         /// </summary>
 88         bool IsExist(Expression<Func<T, bool>> predicate);
 89 
 90         /// <summary>
 91         /// 根據SQL驗證實體對象是否存在
 92         /// </summary>
 93         bool IsExist(string sql, params DbParameter[] para);
 94         #endregion
 95 
 96         #region 多模型操作
 97         /// <summary>
 98         /// 增加多模型數據,指定獨立模型集合
 99         /// </summary>
100         int SaveList<T1>(List<T1> t) where T1 : class;
101         /// <summary>
102         /// 增加多模型數據,與當前模型一致
103         /// </summary>
104         int SaveList(List<T> t);
105         /// <summary>
106         /// 更新多模型,指定獨立模型集合
107         /// </summary>
108         int UpdateList<T1>(List<T1> t) where T1 : class;
109         /// <summary>
110         /// 更新多模型,與當前模型一致
111         /// </summary>
112         int UpdateList(List<T> t);
113         /// <summary>
114         /// 批量刪除數據,當前模型
115         /// </summary>
116         int DeleteList(List<T> t);
117         /// <summary>
118         /// 批量刪除數據,獨立模型
119         /// </summary>
120         int DeleteList<T1>(List<T1> t) where T1 : class;
121         #endregion
122 
123         #region 存儲過程操作
124         /// <summary>
125         /// 執行增刪改存儲過程
126         /// </summary>
127         object ExecuteProc(string procname, params DbParameter[] parameter);
128         /// <summary>
129         /// 執行查詢的存儲過程
130         /// </summary>
131         object ExecuteQueryProc(string procname, params DbParameter[] parameter);
132         #endregion
133 
134         #region 查詢多條數據
135         /// <summary>
136         /// 獲取集合 IQueryable
137         /// </summary>
138         IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate);
139         /// <summary>
140         /// 獲取集合 IList
141         /// </summary>
142         List<T> LoadListAll(Expression<Func<T, bool>> predicate);
143         /// <summary>
144         /// 獲取DbQuery的列表
145         /// </summary>
146         DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate);
147         /// <summary>
148         /// 獲取IEnumerable列表
149         /// </summary>
150         IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para);
151         /// <summary>
152         /// 獲取數據動態集合
153         /// </summary>
154         System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para);
155         /// <summary>
156         /// 采用SQL進行數據的查詢,並轉換
157         /// </summary>
158         List<T> SelectBySql(string sql, params DbParameter[] para);
159         List<T1> SelectBySql<T1>(string sql, params DbParameter[] para);
160         /// <summary>
161         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體對象
162         /// </summary>
163         /// <typeparam name="TEntity">實體對象</typeparam>
164         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
165         /// <typeparam name="TResult">數據結果,一般為object</typeparam>
166         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
167         /// <param name="orderby">排序字段</param>
168         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
169         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
170         /// <returns>實體集合</returns>
171         List<TResult> QueryEntity<TEntity, TOrderBy, TResult>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Expression<Func<TEntity, TResult>> selector, bool IsAsc)
172             where TEntity : class
173             where TResult : class;
174         /// <summary>
175         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回Object對象
176         /// </summary>
177         /// <typeparam name="TEntity">實體對象</typeparam>
178         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
179         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
180         /// <param name="orderby">排序字段</param>
181         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
182         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
183         /// <returns>自定義實體集合</returns>
184         List<object> QueryObject<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc)
185             where TEntity : class;
186         /// <summary>
187         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回動態類對象
188         /// </summary>
189         /// <typeparam name="TEntity">實體對象</typeparam>
190         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
191         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
192         /// <param name="orderby">排序字段</param>
193         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
194         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
195         /// <returns>動態類對象</returns>
196         dynamic QueryDynamic<TEntity, TOrderBy>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TOrderBy>> orderby, Func<IQueryable<TEntity>, List<object>> selector, bool IsAsc)
197             where TEntity : class;
198         #endregion
199 
200         #region 分頁查詢
201 
202         /// <summary>
203         /// 通過SQL分頁
204         /// </summary>
205         /// <param name="sql"></param>
206         /// <param name="parameters"></param>
207         /// <param name="page"></param>
208         /// <returns></returns>
209         IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, PageCollection page);
210         IList<T> PageByListSql(string sql, IList<DbParameter> parameters, PageCollection page);
211         /// <summary>
212         /// 通用EF分頁,默認顯示20條記錄
213         /// </summary>
214         /// <typeparam name="TEntity">實體模型</typeparam>
215         /// <typeparam name="TOrderBy">排序類型</typeparam>
216         /// <param name="index">當前頁</param>
217         /// <param name="pageSize">顯示條數</param>
218         /// <param name="where">過濾條件</param>
219         /// <param name="orderby">排序字段</param>
220         /// <param name="selector">結果集合</param>
221         /// <param name="isAsc">排序方向true正序 false倒序</param>
222         /// <returns>自定義實體集合</returns>
223         PageInfo<object> Query<TEntity, TOrderBy>
224             (int index, int pageSize,
225             Expression<Func<TEntity, bool>> where,
226             Expression<Func<TEntity, TOrderBy>> orderby,
227             Func<IQueryable<TEntity>, List<object>> selector,
228             bool IsAsc)
229             where TEntity : class;
230         /// <summary>
231         /// 對IQueryable對象進行分頁邏輯處理,過濾、查詢項、排序對IQueryable操作
232         /// </summary>
233         /// <param name="t">Iqueryable</param>
234         /// <param name="index">當前頁</param>
235         /// <param name="PageSize">每頁顯示多少條</param>
236         /// <returns>當前IQueryable to List的對象</returns>
237         Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize);
238         /// <summary>
239         /// 普通SQL查詢分頁方法
240         /// </summary>
241         /// <param name="index">當前頁</param>
242         /// <param name="pageSize">顯示行數</param>
243         /// <param name="tableName">表名/視圖</param>
244         /// <param name="field">獲取項</param>
245         /// <param name="filter">過濾條件</param>
246         /// <param name="orderby">排序字段+排序方向</param>
247         /// <param name="group">分組字段</param>
248         /// <returns>結果集</returns>
249         Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para);
250         /// <summary>
251         /// 簡單的Sql查詢分頁
252         /// </summary>
253         /// <param name="index"></param>
254         /// <param name="pageSize"></param>
255         /// <param name="sql"></param>
256         /// <returns></returns>
257         Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para);
258         /// <summary>
259         /// 多表聯合分頁算法
260         /// </summary>
261         PageInfo Query(IQueryable query, int index, int pagesize);
262         #endregion
263 
264         #region ADO.NET增刪改查方法
265         /// <summary>
266         /// 執行增刪改方法,含事務處理
267         /// </summary>
268         object ExecuteSqlCommand(string sql, params DbParameter[] para);
269         /// <summary>
270         /// 執行多條SQL,增刪改方法,含事務處理
271         /// </summary>
272         object ExecuteSqlCommand(Dictionary<string, object> sqllist);
273         /// <summary>
274         /// 執行查詢方法,返回動態類,接收使用var,遍歷時使用dynamic類型
275         /// </summary>
276         object ExecuteSqlQuery(string sql, params DbParameter[] para);
277         #endregion
278     }
279 }
View Code

 

 

注意:在分頁查詢中,我們引用了Common公共類庫的一個公共類 PageCollection.cs

 

這個類庫在C#公共幫助類里面  連接:【C#公共幫助類】 分頁邏輯處理類

 

三、基礎操作的實現類

我們在Service類庫下新建一個公共基礎數據操作類 RepositoryBase.cs 繼承接口 IRepository

 

因為這個實現類呢,東西比較多,如果沒有什么問題,大家可以直接拿來用,鑒於時間的關系(還在上班,大家理解~~),我就直接把代碼貼出來了,這篇文章寫完不是結束,我會抽空再回來簡單介紹一下這個實現類的一些方法和原理,同時,如果網友提出了問題或是整改,我也會回來整理修改。

 

固定公用幫助,含事務

 

 1 #region 固定公用幫助,含事務
 2 
 3         private DbContext context = new MyConfig().db;
 4         /// <summary>
 5         /// 數據上下文--->根據Domain實體模型名稱進行更改
 6         /// </summary>
 7         public DbContext Context
 8         {
 9             get
10             {
11                 context.Configuration.ValidateOnSaveEnabled = false;
12                 return context;
13             }
14         }
15         /// <summary>
16         /// 數據上下文--->拓展屬性
17         /// </summary>
18         public MyConfig Config
19         {
20             get
21             {
22                 return new MyConfig();
23             }
24         }
25         /// <summary>
26         /// 公用泛型處理屬性
27         /// 注:所有泛型操作的基礎
28         /// </summary>
29         public DbSet<T> dbSet
30         {
31             get { return this.Context.Set<T>(); }
32         }
33         /// <summary>
34         /// 事務
35         /// </summary>
36         private DbContextTransaction _transaction = null;
37         /// <summary>
38         /// 開始事務
39         /// </summary>
40         public DbContextTransaction Transaction
41         {
42             get
43             {
44                 if (this._transaction == null)
45                 {
46                     this._transaction = this.Context.Database.BeginTransaction();
47                 }
48                 return this._transaction;
49             }
50             set { this._transaction = value; }
51         }
52         /// <summary>
53         /// 事務狀態
54         /// </summary>
55         public bool Committed { get; set; }
56         /// <summary>
57         /// 異步鎖定
58         /// </summary>
59         private readonly object sync = new object();
60         /// <summary>
61         /// 提交事務
62         /// </summary>
63         public void Commit()
64         {
65             if (!Committed)
66             {
67                 lock (sync)
68                 {
69                     if (this._transaction != null)
70                         _transaction.Commit();
71                 }
72                 Committed = true;
73             }
74         }
75         /// <summary>
76         /// 回滾事務
77         /// </summary>
78         public void Rollback()
79         {
80             Committed = false;
81             if (this._transaction != null)
82                 this._transaction.Rollback();
83         }
84         #endregion
View Code

 

 

獲取單條記錄

 

 1  #region 獲取單條記錄
 2         /// <summary>
 3         /// 通過lambda表達式獲取一條記錄p=>p.id==id
 4         /// </summary>
 5         public virtual T Get(Expression<Func<T, bool>> predicate)
 6         {
 7             try
 8             {
 9                 return dbSet.AsNoTracking().SingleOrDefault(predicate);
10             }
11             catch (Exception e)
12             {
13                 throw e;
14             }
15         }
16         #endregion
View Code

 

 

增刪改操作

 

 1 #region 增刪改操作
 2 
 3         /// <summary>
 4         /// 添加一條模型記錄,自動提交更改
 5         /// </summary>
 6         public virtual bool Save(T entity)
 7         {
 8             try
 9             {
10                 int row = 0;
11                 var entry = this.Context.Entry<T>(entity);
12                 entry.State = System.Data.Entity.EntityState.Added;
13                 row = Context.SaveChanges();
14                 entry.State = System.Data.Entity.EntityState.Detached;
15                 return row > 0;
16             }
17             catch (Exception e)
18             {
19                 throw e;
20             }
21 
22         }
23 
24         /// <summary>
25         /// 更新一條模型記錄,自動提交更改
26         /// </summary>
27         public virtual bool Update(T entity)
28         {
29             try
30             {
31                 int rows = 0;
32                 var entry = this.Context.Entry(entity);
33                 entry.State = System.Data.Entity.EntityState.Modified;
34                 rows = this.Context.SaveChanges();
35                 entry.State = System.Data.Entity.EntityState.Detached;
36                 return rows > 0;
37             }
38             catch (Exception e)
39             {
40                 throw e;
41             }
42         }
43 
44         /// <summary>
45         /// 更新模型記錄,如不存在進行添加操作
46         /// </summary>
47         public virtual bool SaveOrUpdate(T entity, bool isEdit)
48         {
49             try
50             {
51                 return isEdit ? Update(entity) : Save(entity);
52             }
53             catch (Exception e) { throw e; }
54         }
55 
56         /// <summary>
57         /// 刪除一條或多條模型記錄,含事務
58         /// </summary>
59         public virtual int Delete(Expression<Func<T, bool>> predicate = null)
60         {
61             try
62             {
63                 int rows = 0;
64                 IQueryable<T> entry = (predicate == null) ? this.dbSet.AsQueryable() : this.dbSet.Where(predicate);
65                 List<T> list = entry.ToList();
66                 if (list.Count > 0)
67                 {
68                     for (int i = 0; i < list.Count; i++)
69                     {
70                         this.dbSet.Remove(list[i]);
71                     }
72                     rows = this.Context.SaveChanges();
73                 }
74                 return rows;
75             }
76             catch (Exception e)
77             {
78                 throw e;
79             }
80         }
81         /// <summary>
82         /// 使用原始SQL語句,含事務處理
83         /// </summary>
84         public virtual int DeleteBySql(string sql, params DbParameter[] para)
85         {
86             try
87             {
88                 return this.Context.Database.ExecuteSqlCommand(sql, para);
89             }
90             catch (Exception e)
91             {
92                 throw e;
93             }
94         }
95         #endregion
View Code

 

 

多模型操作

 

  1  #region 多模型操作
  2 
  3         /// <summary>
  4         /// 增加多模型數據,指定獨立模型集合
  5         /// </summary>
  6         public virtual int SaveList<T1>(List<T1> t) where T1 : class
  7         {
  8             try
  9             {
 10                 if (t == null || t.Count == 0) return 0;
 11                 this.Context.Set<T1>().Local.Clear();
 12                 foreach (var item in t)
 13                 {
 14                     this.Context.Set<T1>().Add(item);
 15                 }
 16                 return this.Context.SaveChanges();
 17             }
 18             catch (Exception e)
 19             {
 20                 throw e;
 21             }
 22         }
 23         /// <summary>
 24         /// 增加多模型數據,與當前模型一致
 25         /// </summary>
 26         public virtual int SaveList(List<T> t)
 27         {
 28             try
 29             {
 30                 this.dbSet.Local.Clear();
 31                 foreach (var item in t)
 32                 {
 33                     this.dbSet.Add(item);
 34                 }
 35                 return this.Context.SaveChanges();
 36             }
 37             catch (Exception e)
 38             {
 39                 throw e;
 40             }
 41         }
 42         /// <summary>
 43         /// 更新多模型,指定獨立模型集合
 44         /// </summary>
 45         public virtual int UpdateList<T1>(List<T1> t) where T1 : class
 46         {
 47             if (t.Count <= 0) return 0;
 48             try
 49             {
 50                 foreach (var item in t)
 51                 {
 52                     this.Context.Entry<T1>(item).State = System.Data.Entity.EntityState.Modified;
 53                 }
 54                 return this.Context.SaveChanges();
 55             }
 56             catch (Exception e)
 57             {
 58                 throw e;
 59             }
 60         }
 61         /// <summary>
 62         /// 更新多模型,與當前模型一致
 63         /// </summary>
 64         public virtual int UpdateList(List<T> t)
 65         {
 66             if (t.Count <= 0) return 0;
 67             try
 68             {
 69                 foreach (var item in t)
 70                 {
 71                     this.Context.Entry(item).State = System.Data.Entity.EntityState.Modified;
 72                 }
 73                 return this.Context.SaveChanges();
 74             }
 75             catch (Exception e) { throw e; }
 76         }
 77         /// <summary>
 78         /// 批量刪除數據,當前模型
 79         /// </summary>
 80         public virtual int DeleteList(List<T> t)
 81         {
 82             if (t == null || t.Count == 0) return 0;
 83             foreach (var item in t)
 84             {
 85                 this.dbSet.Remove(item);
 86             }
 87             return this.Context.SaveChanges();
 88         }
 89         /// <summary>
 90         /// 批量刪除數據,自定義模型
 91         /// </summary>
 92         public virtual int DeleteList<T1>(List<T1> t) where T1 : class
 93         {
 94             try
 95             {
 96                 if (t == null || t.Count == 0) return 0;
 97                 foreach (var item in t)
 98                 {
 99                     this.Context.Set<T1>().Remove(item);
100                 }
101                 return this.Context.SaveChanges();
102             }
103             catch (Exception e) { throw e; }
104         }
105         #endregion
View Code

 

 

存儲過程操作

 

 1  #region 存儲過程操作
 2         /// <summary>
 3         /// 執行返回影響行數的存儲過程
 4         /// </summary>
 5         /// <param name="procname">過程名稱</param>
 6         /// <param name="parameter">參數對象</param>
 7         /// <returns></returns>
 8         public virtual object ExecuteProc(string procname, params DbParameter[] parameter)
 9         {
10             try
11             {
12                 return ExecuteSqlCommand(procname, parameter);
13             }
14             catch (Exception e)
15             {
16                 throw e;
17             }
18         }
19         /// <summary>
20         /// 執行返回結果集的存儲過程
21         /// </summary>
22         /// <param name="procname">過程名稱</param>
23         /// <param name="parameter">參數對象</param>
24         /// <returns></returns>
25         public virtual object ExecuteQueryProc(string procname, params DbParameter[] parameter)
26         {
27             try
28             {
29                 return this.Context.Database.SqlFunctionForDynamic(procname, parameter);
30             }
31             catch (Exception e)
32             {
33                 throw e;
34             }
35         }
36         #endregion
View Code

 

 

存在驗證操作

 

 1  #region 存在驗證操作
 2         /// <summary>
 3         /// 驗證當前條件是否存在相同項
 4         /// </summary>
 5         public virtual bool IsExist(Expression<Func<T, bool>> predicate)
 6         {
 7             var entry = this.dbSet.Where(predicate);
 8             return (entry.Any());
 9         }
10 
11         /// <summary>
12         /// 根據SQL驗證實體對象是否存在
13         /// </summary>
14         public virtual bool IsExist(string sql, params DbParameter[] para)
15         {
16             IEnumerable result = this.Context.Database.SqlQuery(typeof(int), sql, para);
17 
18             if (result.GetEnumerator().Current == null || result.GetEnumerator().Current.ToString() == "0")
19                 return false;
20             return true;
21         }
22         #endregion
View Code

 

 

獲取多條數據操作

 

  1  #region 獲取多條數據操作
  2         /// <summary>
  3         /// 返回IQueryable集合,延時加載數據
  4         /// </summary>
  5         public virtual IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate)
  6         {
  7             try
  8             {
  9                 if (predicate != null)
 10                 {
 11                     return this.dbSet.Where(predicate).AsNoTracking<T>();
 12                 }
 13                 return this.dbSet.AsQueryable<T>().AsNoTracking<T>();
 14             }
 15             catch (Exception e)
 16             {
 17                 throw e;
 18             }
 19         }
 20         /// <summary>
 21         /// 返回DbQuery集合,延時加載數據
 22         /// </summary>
 23         public virtual DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate)
 24         {
 25             try
 26             {
 27                 if (predicate != null)
 28                 {
 29                     return this.dbSet.Where(predicate) as DbQuery<T>;
 30                 }
 31                 return this.dbSet;
 32             }
 33             catch (Exception e)
 34             {
 35                 throw e;
 36             }
 37         }
 38         /// <summary>
 39         /// 返回List集合,不采用延時加載
 40         /// </summary>
 41         public virtual List<T> LoadListAll(Expression<Func<T, bool>> predicate)
 42         {
 43             try
 44             {
 45                 if (predicate != null)
 46                 {
 47                     return this.dbSet.Where(predicate).AsNoTracking().ToList();
 48                 }
 49                 return this.dbSet.AsQueryable<T>().AsNoTracking().ToList();
 50             }
 51             catch (Exception e)
 52             {
 53                 throw e;
 54             }
 55         }
 56         /// <summary>
 57         /// 返回IEnumerable集合,采用原始T-Sql方式
 58         /// </summary>
 59         public virtual IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para)
 60         {
 61             try
 62             {
 63                 return this.Context.Database.SqlQuery<T>(sql, para);
 64             }
 65             catch (Exception e)
 66             {
 67                 throw e;
 68             }
 69         }
 70         /// <summary>
 71         /// 返回IEnumerable動態集合,采用原始T-Sql方式
 72         /// </summary>
 73         public virtual System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para)
 74         {
 75             try
 76             {
 77                 return this.Context.Database.SqlQueryForDynamic(sql, para);
 78             }
 79             catch (Exception e)
 80             {
 81                 throw e;
 82             }
 83         }
 84         /// <summary>
 85         /// 返回IList集合,采用原始T-Sql方式
 86         /// </summary>
 87         public virtual List<T> SelectBySql(string sql, params DbParameter[] para)
 88         {
 89             try
 90             {
 91                 return this.Context.Database.SqlQuery(typeof(T), sql, para).Cast<T>().ToList();
 92             }
 93             catch (Exception e)
 94             {
 95                 throw e;
 96             }
 97         }
 98         /// <summary>
 99         /// 指定泛型,返回IList集合,采用原始T-Sql方式
100         /// </summary>
101         public virtual List<T1> SelectBySql<T1>(string sql, params DbParameter[] para)
102         {
103             try
104             {
105                 return this.Context.Database.SqlQuery<T1>(sql, para).ToList();
106             }
107             catch (Exception e)
108             {
109                 throw e;
110             }
111         }
112         /// <summary>
113         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體對象
114         /// </summary>
115         /// <typeparam name="TEntity">實體對象</typeparam>
116         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
117         /// <typeparam name="TResult">數據結果,與TEntity一致</typeparam>
118         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
119         /// <param name="orderby">排序字段</param>
120         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
121         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
122         /// <returns>實體集合</returns>
123         public virtual List<TResult> QueryEntity<TEntity, TOrderBy, TResult>
124             (Expression<Func<TEntity, bool>> where,
125             Expression<Func<TEntity, TOrderBy>> orderby,
126             Expression<Func<TEntity, TResult>> selector,
127             bool IsAsc)
128             where TEntity : class
129             where TResult : class
130         {
131             IQueryable<TEntity> query = this.Context.Set<TEntity>();
132             if (where != null)
133             {
134                 query = query.Where(where);
135             }
136 
137             if (orderby != null)
138             {
139                 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
140             }
141             if (selector == null)
142             {
143                 return query.Cast<TResult>().AsNoTracking().ToList();
144             }
145             return query.Select(selector).AsNoTracking().ToList();
146         }
147 
148         /// <summary>
149         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回Object對象
150         /// </summary>
151         /// <typeparam name="TEntity">實體對象</typeparam>
152         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
153         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
154         /// <param name="orderby">排序字段</param>
155         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
156         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
157         /// <returns>自定義實體集合</returns>
158         public virtual List<object> QueryObject<TEntity, TOrderBy>
159             (Expression<Func<TEntity, bool>> where,
160             Expression<Func<TEntity, TOrderBy>> orderby,
161             Func<IQueryable<TEntity>,
162             List<object>> selector,
163             bool IsAsc)
164             where TEntity : class
165         {
166             IQueryable<TEntity> query = this.Context.Set<TEntity>();
167             if (where != null)
168             {
169                 query = query.Where(where);
170             }
171 
172             if (orderby != null)
173             {
174                 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
175             }
176             if (selector == null)
177             {
178                 return query.AsNoTracking().ToList<object>();
179             }
180             return selector(query);
181         }
182 
183         /// <summary>
184         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回動態類對象
185         /// </summary>
186         /// <typeparam name="TEntity">實體對象</typeparam>
187         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
188         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
189         /// <param name="orderby">排序字段</param>
190         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
191         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
192         /// <returns>動態類</returns>
193         public virtual dynamic QueryDynamic<TEntity, TOrderBy>
194             (Expression<Func<TEntity, bool>> where,
195             Expression<Func<TEntity, TOrderBy>> orderby,
196             Func<IQueryable<TEntity>,
197             List<object>> selector,
198             bool IsAsc)
199             where TEntity : class
200         {
201             List<object> list = QueryObject<TEntity, TOrderBy>
202                  (where, orderby, selector, IsAsc);
203             return Common.JsonConverter.JsonClass(list);
204         }
205         #endregion
View Code

 

 

分頁操作

 

  1  #region 分頁操作
  2         /// <summary>
  3         /// 待自定義分頁函數,使用必須重寫,指定數據模型
  4         /// </summary>
  5         public virtual IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, Common.PageCollection page)
  6         {
  7             return null;
  8         }
  9         /// <summary>
 10         /// 待自定義分頁函數,使用必須重寫,
 11         /// </summary>
 12         public virtual IList<T> PageByListSql(string sql, IList<DbParameter> parameters, Common.PageCollection page)
 13         {
 14             return null;
 15         }
 16 
 17         /// <summary>
 18         /// 對IQueryable對象進行分頁邏輯處理,過濾、查詢項、排序對IQueryable操作
 19         /// </summary>
 20         /// <param name="t">Iqueryable</param>
 21         /// <param name="index">當前頁</param>
 22         /// <param name="PageSize">每頁顯示多少條</param>
 23         /// <returns>當前IQueryable to List的對象</returns>
 24         public virtual Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize)
 25         {
 26             if (index < 1)
 27             {
 28                 index = 1;
 29             }
 30             if (PageSize <= 0)
 31             {
 32                 PageSize = 20;
 33             }
 34             int count = query.Count();
 35 
 36             int maxpage = count / PageSize;
 37 
 38             if (count % PageSize > 0)
 39             {
 40                 maxpage++;
 41             }
 42             if (index > maxpage)
 43             {
 44                 index = maxpage;
 45             }
 46             if (count > 0)
 47                 query = query.Skip((index - 1) * PageSize).Take(PageSize);
 48             return new Common.PageInfo<T>(index, PageSize, count, query.ToList());
 49         }
 50         /// <summary>
 51         /// 通用EF分頁,默認顯示20條記錄
 52         /// </summary>
 53         /// <typeparam name="TEntity">實體模型</typeparam>
 54         /// <typeparam name="TOrderBy">排序類型</typeparam>
 55         /// <param name="index">當前頁</param>
 56         /// <param name="pageSize">顯示條數</param>
 57         /// <param name="where">過濾條件</param>
 58         /// <param name="orderby">排序字段</param>
 59         /// <param name="selector">結果集合</param>
 60         /// <param name="isAsc">排序方向true正序 false倒序</param>
 61         /// <returns>自定義實體集合</returns>
 62         public virtual Common.PageInfo<object> Query<TEntity, TOrderBy>
 63             (int index, int pageSize,
 64             Expression<Func<TEntity, bool>> where,
 65             Expression<Func<TEntity, TOrderBy>> orderby,
 66             Func<IQueryable<TEntity>,
 67             List<object>> selector,
 68             bool isAsc)
 69             where TEntity : class
 70         {
 71             if (index < 1)
 72             {
 73                 index = 1;
 74             }
 75 
 76             if (pageSize <= 0)
 77             {
 78                 pageSize = 20;
 79             }
 80 
 81             IQueryable<TEntity> query = this.Context.Set<TEntity>();
 82             if (where != null)
 83             {
 84                 query = query.Where(where);
 85             }
 86             int count = query.Count();
 87 
 88             int maxpage = count / pageSize;
 89 
 90             if (count % pageSize > 0)
 91             {
 92                 maxpage++;
 93             }
 94             if (index > maxpage)
 95             {
 96                 index = maxpage;
 97             }
 98 
 99             if (orderby != null)
100             {
101                 query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
102             }
103             if (count > 0)
104                 query = query.Skip((index - 1) * pageSize).Take(pageSize);
105             //返回結果為null,返回所有字段
106             if (selector == null)
107                 return new Common.PageInfo<object>(index, pageSize, count, query.ToList<object>());
108             return new Common.PageInfo<object>(index, pageSize, count, selector(query).ToList());
109         }
110         /// <summary>
111         /// 普通SQL查詢分頁方法
112         /// </summary>
113         /// <param name="index">當前頁</param>
114         /// <param name="pageSize">顯示行數</param>
115         /// <param name="tableName">表名/視圖</param>
116         /// <param name="field">獲取項</param>
117         /// <param name="filter">過濾條件</param>
118         /// <param name="orderby">排序字段+排序方向</param>
119         /// <param name="group">分組字段</param>
120         /// <returns>結果集</returns>
121         public virtual Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para)
122         {
123             //執行分頁算法
124             if (index <= 0)
125                 index = 1;
126             int start = (index - 1) * pageSize;
127             if (start > 0)
128                 start -= 1;
129             else
130                 start = 0;
131             int end = index * pageSize;
132 
133             #region 查詢邏輯
134             string logicSql = "SELECT";
135             //查詢項
136             if (!string.IsNullOrEmpty(field))
137             {
138                 logicSql += " " + field;
139             }
140             else
141             {
142                 logicSql += " *";
143             }
144             logicSql += " FROM (" + tableName + " ) where";
145             //過濾條件
146             if (!string.IsNullOrEmpty(filter))
147             {
148                 logicSql += " " + filter;
149             }
150             else
151             {
152                 filter = " 1=1";
153                 logicSql += "  1=1";
154             }
155             //分組
156             if (!string.IsNullOrEmpty(group))
157             {
158                 logicSql += " group by " + group;
159             }
160 
161             #endregion
162 
163             //獲取當前條件下數據總條數
164             int count = this.Context.Database.SqlQuery(typeof(int), "select count(*) from (" + tableName + ") where " + filter, para).Cast<int>().FirstOrDefault();
165             string sql = "SELECT T.* FROM ( SELECT B.* FROM ( SELECT A.*,ROW_NUMBER() OVER(ORDER BY getdate()) as RN" +
166                          logicSql + ") A ) B WHERE B.RN<=" + end + ") T WHERE T.RN>" + start;
167             //排序
168             if (!string.IsNullOrEmpty(orderby))
169             {
170                 sql += " order by " + orderby;
171             }
172             var list = ExecuteSqlQuery(sql, para) as IEnumerable;
173             if (list != null)
174                 return new Common.PageInfo(index, pageSize, count, list.Cast<object>().ToList());
175             return new Common.PageInfo(index, pageSize, count, new { });
176         }
177 
178         /// <summary>
179         /// 最簡單的SQL分頁
180         /// </summary>
181         /// <param name="index">頁碼</param>
182         /// <param name="pageSize">顯示行數</param>
183         /// <param name="sql">純SQL語句</param>
184         /// <param name="orderby">排序字段與方向</param>
185         /// <returns></returns>
186         public virtual Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para)
187         {
188             return this.Query(index, pageSize, sql, null, null, orderby, null, para);
189         }
190         /// <summary>
191         /// 多表聯合分頁算法
192         /// </summary>
193         public virtual Common.PageInfo Query(IQueryable query, int index, int PageSize)
194         {
195             var enumerable = (query as System.Collections.IEnumerable).Cast<object>();
196             if (index < 1)
197             {
198                 index = 1;
199             }
200             if (PageSize <= 0)
201             {
202                 PageSize = 20;
203             }
204 
205             int count = enumerable.Count();
206 
207             int maxpage = count / PageSize;
208 
209             if (count % PageSize > 0)
210             {
211                 maxpage++;
212             }
213             if (index > maxpage)
214             {
215                 index = maxpage;
216             }
217             if (count > 0)
218                 enumerable = enumerable.Skip((index - 1) * PageSize).Take(PageSize);
219             return new Common.PageInfo(index, PageSize, count, enumerable.ToList());
220         }
221         #endregion
View Code

 

 

ADO.NET增刪改查方法

 

 1 #region ADO.NET增刪改查方法
 2         /// <summary>
 3         /// 執行增刪改方法,含事務處理
 4         /// </summary>
 5         public virtual object ExecuteSqlCommand(string sql, params DbParameter[] para)
 6         {
 7             try
 8             {
 9                 return this.Context.Database.ExecuteSqlCommand(sql, para);
10             }
11             catch (Exception e)
12             {
13                 throw e;
14             }
15 
16         }
17         /// <summary>
18         /// 執行多條SQL,增刪改方法,含事務處理
19         /// </summary>
20         public virtual object ExecuteSqlCommand(Dictionary<string, object> sqllist)
21         {
22             try
23             {
24                 int rows = 0;
25                 IEnumerator<KeyValuePair<string, object>> enumerator = sqllist.GetEnumerator();
26                 using (Transaction)
27                 {
28                     while (enumerator.MoveNext())
29                     {
30                         rows += this.Context.Database.ExecuteSqlCommand(enumerator.Current.Key, enumerator.Current.Value);
31                     }
32                     Commit();
33                 }
34                 return rows;
35             }
36             catch (Exception e)
37             {
38                 Rollback();
39                 throw e;
40             }
41 
42         }
43         /// <summary>
44         /// 執行查詢方法,返回動態類,接收使用var,遍歷時使用dynamic類型
45         /// </summary>
46         public virtual object ExecuteSqlQuery(string sql, params DbParameter[] para)
47         {
48             try
49             {
50                 return this.Context.Database.SqlQueryForDynamic(sql, para);
51             }
52             catch (Exception e)
53             {
54                 throw e;
55             }
56         }
57         #endregion
View Code

 

 

我們引用的類庫和解決方案

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Data;
 6 using System.Data.Common;
 7 using System.Data.Entity;
 8 using System.Data.Entity.Infrastructure;
 9 using Domain;
10 using System.Linq.Expressions;
11 using System.Collections;
View Code

 

 

完整的 RepositoryBase.cs

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Data;
  6 using System.Data.Common;
  7 using System.Data.Entity;
  8 using System.Data.Entity.Infrastructure;
  9 using Domain;
 10 using System.Linq.Expressions;
 11 using System.Collections;
 12 
 13 namespace Service
 14 {
 15     /// <summary>
 16     /// 數據操作基本實現類,公用實現方法
 17     /// add yuangang by 2016-05-10
 18     /// </summary>
 19     /// <typeparam name="T">具體操作的實體模型</typeparam>
 20     public abstract class RepositoryBase<T> : IRepository<T> where T : class
 21     {
 22         #region 固定公用幫助,含事務
 23 
 24         private DbContext context = new MyConfig().db;
 25         /// <summary>
 26         /// 數據上下文--->根據Domain實體模型名稱進行更改
 27         /// </summary>
 28         public DbContext Context
 29         {
 30             get
 31             {
 32                 context.Configuration.ValidateOnSaveEnabled = false;
 33                 return context;
 34             }
 35         }
 36         /// <summary>
 37         /// 數據上下文--->拓展屬性
 38         /// </summary>
 39         public MyConfig Config
 40         {
 41             get
 42             {
 43                 return new MyConfig();
 44             }
 45         }
 46         /// <summary>
 47         /// 公用泛型處理屬性
 48         /// 注:所有泛型操作的基礎
 49         /// </summary>
 50         public DbSet<T> dbSet
 51         {
 52             get { return this.Context.Set<T>(); }
 53         }
 54         /// <summary>
 55         /// 事務
 56         /// </summary>
 57         private DbContextTransaction _transaction = null;
 58         /// <summary>
 59         /// 開始事務
 60         /// </summary>
 61         public DbContextTransaction Transaction
 62         {
 63             get
 64             {
 65                 if (this._transaction == null)
 66                 {
 67                     this._transaction = this.Context.Database.BeginTransaction();
 68                 }
 69                 return this._transaction;
 70             }
 71             set { this._transaction = value; }
 72         }
 73         /// <summary>
 74         /// 事務狀態
 75         /// </summary>
 76         public bool Committed { get; set; }
 77         /// <summary>
 78         /// 異步鎖定
 79         /// </summary>
 80         private readonly object sync = new object();
 81         /// <summary>
 82         /// 提交事務
 83         /// </summary>
 84         public void Commit()
 85         {
 86             if (!Committed)
 87             {
 88                 lock (sync)
 89                 {
 90                     if (this._transaction != null)
 91                         _transaction.Commit();
 92                 }
 93                 Committed = true;
 94             }
 95         }
 96         /// <summary>
 97         /// 回滾事務
 98         /// </summary>
 99         public void Rollback()
100         {
101             Committed = false;
102             if (this._transaction != null)
103                 this._transaction.Rollback();
104         }
105         #endregion
106 
107         #region 獲取單條記錄
108         /// <summary>
109         /// 通過lambda表達式獲取一條記錄p=>p.id==id
110         /// </summary>
111         public virtual T Get(Expression<Func<T, bool>> predicate)
112         {
113             try
114             {
115                 return dbSet.AsNoTracking().SingleOrDefault(predicate);
116             }
117             catch (Exception e)
118             {
119                 throw e;
120             }
121         }
122         #endregion
123 
124         #region 增刪改操作
125 
126         /// <summary>
127         /// 添加一條模型記錄,自動提交更改
128         /// </summary>
129         public virtual bool Save(T entity)
130         {
131             try
132             {
133                 int row = 0;
134                 var entry = this.Context.Entry<T>(entity);
135                 entry.State = System.Data.Entity.EntityState.Added;
136                 row = Context.SaveChanges();
137                 entry.State = System.Data.Entity.EntityState.Detached;
138                 return row > 0;
139             }
140             catch (Exception e)
141             {
142                 throw e;
143             }
144 
145         }
146 
147         /// <summary>
148         /// 更新一條模型記錄,自動提交更改
149         /// </summary>
150         public virtual bool Update(T entity)
151         {
152             try
153             {
154                 int rows = 0;
155                 var entry = this.Context.Entry(entity);
156                 entry.State = System.Data.Entity.EntityState.Modified;
157                 rows = this.Context.SaveChanges();
158                 entry.State = System.Data.Entity.EntityState.Detached;
159                 return rows > 0;
160             }
161             catch (Exception e)
162             {
163                 throw e;
164             }
165         }
166 
167         /// <summary>
168         /// 更新模型記錄,如不存在進行添加操作
169         /// </summary>
170         public virtual bool SaveOrUpdate(T entity, bool isEdit)
171         {
172             try
173             {
174                 return isEdit ? Update(entity) : Save(entity);
175             }
176             catch (Exception e) { throw e; }
177         }
178 
179         /// <summary>
180         /// 刪除一條或多條模型記錄,含事務
181         /// </summary>
182         public virtual int Delete(Expression<Func<T, bool>> predicate = null)
183         {
184             try
185             {
186                 int rows = 0;
187                 IQueryable<T> entry = (predicate == null) ? this.dbSet.AsQueryable() : this.dbSet.Where(predicate);
188                 List<T> list = entry.ToList();
189                 if (list.Count > 0)
190                 {
191                     for (int i = 0; i < list.Count; i++)
192                     {
193                         this.dbSet.Remove(list[i]);
194                     }
195                     rows = this.Context.SaveChanges();
196                 }
197                 return rows;
198             }
199             catch (Exception e)
200             {
201                 throw e;
202             }
203         }
204         /// <summary>
205         /// 使用原始SQL語句,含事務處理
206         /// </summary>
207         public virtual int DeleteBySql(string sql, params DbParameter[] para)
208         {
209             try
210             {
211                 return this.Context.Database.ExecuteSqlCommand(sql, para);
212             }
213             catch (Exception e)
214             {
215                 throw e;
216             }
217         }
218         #endregion
219 
220         #region 多模型操作
221 
222         /// <summary>
223         /// 增加多模型數據,指定獨立模型集合
224         /// </summary>
225         public virtual int SaveList<T1>(List<T1> t) where T1 : class
226         {
227             try
228             {
229                 if (t == null || t.Count == 0) return 0;
230                 this.Context.Set<T1>().Local.Clear();
231                 foreach (var item in t)
232                 {
233                     this.Context.Set<T1>().Add(item);
234                 }
235                 return this.Context.SaveChanges();
236             }
237             catch (Exception e)
238             {
239                 throw e;
240             }
241         }
242         /// <summary>
243         /// 增加多模型數據,與當前模型一致
244         /// </summary>
245         public virtual int SaveList(List<T> t)
246         {
247             try
248             {
249                 this.dbSet.Local.Clear();
250                 foreach (var item in t)
251                 {
252                     this.dbSet.Add(item);
253                 }
254                 return this.Context.SaveChanges();
255             }
256             catch (Exception e)
257             {
258                 throw e;
259             }
260         }
261         /// <summary>
262         /// 更新多模型,指定獨立模型集合
263         /// </summary>
264         public virtual int UpdateList<T1>(List<T1> t) where T1 : class
265         {
266             if (t.Count <= 0) return 0;
267             try
268             {
269                 foreach (var item in t)
270                 {
271                     this.Context.Entry<T1>(item).State = System.Data.Entity.EntityState.Modified;
272                 }
273                 return this.Context.SaveChanges();
274             }
275             catch (Exception e)
276             {
277                 throw e;
278             }
279         }
280         /// <summary>
281         /// 更新多模型,與當前模型一致
282         /// </summary>
283         public virtual int UpdateList(List<T> t)
284         {
285             if (t.Count <= 0) return 0;
286             try
287             {
288                 foreach (var item in t)
289                 {
290                     this.Context.Entry(item).State = System.Data.Entity.EntityState.Modified;
291                 }
292                 return this.Context.SaveChanges();
293             }
294             catch (Exception e) { throw e; }
295         }
296         /// <summary>
297         /// 批量刪除數據,當前模型
298         /// </summary>
299         public virtual int DeleteList(List<T> t)
300         {
301             if (t == null || t.Count == 0) return 0;
302             foreach (var item in t)
303             {
304                 this.dbSet.Remove(item);
305             }
306             return this.Context.SaveChanges();
307         }
308         /// <summary>
309         /// 批量刪除數據,自定義模型
310         /// </summary>
311         public virtual int DeleteList<T1>(List<T1> t) where T1 : class
312         {
313             try
314             {
315                 if (t == null || t.Count == 0) return 0;
316                 foreach (var item in t)
317                 {
318                     this.Context.Set<T1>().Remove(item);
319                 }
320                 return this.Context.SaveChanges();
321             }
322             catch (Exception e) { throw e; }
323         }
324         #endregion
325 
326         #region 存儲過程操作
327         /// <summary>
328         /// 執行返回影響行數的存儲過程
329         /// </summary>
330         /// <param name="procname">過程名稱</param>
331         /// <param name="parameter">參數對象</param>
332         /// <returns></returns>
333         public virtual object ExecuteProc(string procname, params DbParameter[] parameter)
334         {
335             try
336             {
337                 return ExecuteSqlCommand(procname, parameter);
338             }
339             catch (Exception e)
340             {
341                 throw e;
342             }
343         }
344         /// <summary>
345         /// 執行返回結果集的存儲過程
346         /// </summary>
347         /// <param name="procname">過程名稱</param>
348         /// <param name="parameter">參數對象</param>
349         /// <returns></returns>
350         public virtual object ExecuteQueryProc(string procname, params DbParameter[] parameter)
351         {
352             try
353             {
354                 return this.Context.Database.SqlFunctionForDynamic(procname, parameter);
355             }
356             catch (Exception e)
357             {
358                 throw e;
359             }
360         }
361         #endregion
362 
363         #region 存在驗證操作
364         /// <summary>
365         /// 驗證當前條件是否存在相同項
366         /// </summary>
367         public virtual bool IsExist(Expression<Func<T, bool>> predicate)
368         {
369             var entry = this.dbSet.Where(predicate);
370             return (entry.Any());
371         }
372 
373         /// <summary>
374         /// 根據SQL驗證實體對象是否存在
375         /// </summary>
376         public virtual bool IsExist(string sql, params DbParameter[] para)
377         {
378             IEnumerable result = this.Context.Database.SqlQuery(typeof(int), sql, para);
379 
380             if (result.GetEnumerator().Current == null || result.GetEnumerator().Current.ToString() == "0")
381                 return false;
382             return true;
383         }
384         #endregion
385 
386         #region 獲取多條數據操作
387         /// <summary>
388         /// 返回IQueryable集合,延時加載數據
389         /// </summary>
390         public virtual IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate)
391         {
392             try
393             {
394                 if (predicate != null)
395                 {
396                     return this.dbSet.Where(predicate).AsNoTracking<T>();
397                 }
398                 return this.dbSet.AsQueryable<T>().AsNoTracking<T>();
399             }
400             catch (Exception e)
401             {
402                 throw e;
403             }
404         }
405         /// <summary>
406         /// 返回DbQuery集合,延時加載數據
407         /// </summary>
408         public virtual DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate)
409         {
410             try
411             {
412                 if (predicate != null)
413                 {
414                     return this.dbSet.Where(predicate) as DbQuery<T>;
415                 }
416                 return this.dbSet;
417             }
418             catch (Exception e)
419             {
420                 throw e;
421             }
422         }
423         /// <summary>
424         /// 返回List集合,不采用延時加載
425         /// </summary>
426         public virtual List<T> LoadListAll(Expression<Func<T, bool>> predicate)
427         {
428             try
429             {
430                 if (predicate != null)
431                 {
432                     return this.dbSet.Where(predicate).AsNoTracking().ToList();
433                 }
434                 return this.dbSet.AsQueryable<T>().AsNoTracking().ToList();
435             }
436             catch (Exception e)
437             {
438                 throw e;
439             }
440         }
441         /// <summary>
442         /// 返回IEnumerable集合,采用原始T-Sql方式
443         /// </summary>
444         public virtual IEnumerable<T> LoadEnumerableAll(string sql, params DbParameter[] para)
445         {
446             try
447             {
448                 return this.Context.Database.SqlQuery<T>(sql, para);
449             }
450             catch (Exception e)
451             {
452                 throw e;
453             }
454         }
455         /// <summary>
456         /// 返回IEnumerable動態集合,采用原始T-Sql方式
457         /// </summary>
458         public virtual System.Collections.IEnumerable LoadEnumerable(string sql, params DbParameter[] para)
459         {
460             try
461             {
462                 return this.Context.Database.SqlQueryForDynamic(sql, para);
463             }
464             catch (Exception e)
465             {
466                 throw e;
467             }
468         }
469         /// <summary>
470         /// 返回IList集合,采用原始T-Sql方式
471         /// </summary>
472         public virtual List<T> SelectBySql(string sql, params DbParameter[] para)
473         {
474             try
475             {
476                 return this.Context.Database.SqlQuery(typeof(T), sql, para).Cast<T>().ToList();
477             }
478             catch (Exception e)
479             {
480                 throw e;
481             }
482         }
483         /// <summary>
484         /// 指定泛型,返回IList集合,采用原始T-Sql方式
485         /// </summary>
486         public virtual List<T1> SelectBySql<T1>(string sql, params DbParameter[] para)
487         {
488             try
489             {
490                 return this.Context.Database.SqlQuery<T1>(sql, para).ToList();
491             }
492             catch (Exception e)
493             {
494                 throw e;
495             }
496         }
497         /// <summary>
498         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體對象
499         /// </summary>
500         /// <typeparam name="TEntity">實體對象</typeparam>
501         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
502         /// <typeparam name="TResult">數據結果,與TEntity一致</typeparam>
503         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
504         /// <param name="orderby">排序字段</param>
505         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
506         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
507         /// <returns>實體集合</returns>
508         public virtual List<TResult> QueryEntity<TEntity, TOrderBy, TResult>
509             (Expression<Func<TEntity, bool>> where,
510             Expression<Func<TEntity, TOrderBy>> orderby,
511             Expression<Func<TEntity, TResult>> selector,
512             bool IsAsc)
513             where TEntity : class
514             where TResult : class
515         {
516             IQueryable<TEntity> query = this.Context.Set<TEntity>();
517             if (where != null)
518             {
519                 query = query.Where(where);
520             }
521 
522             if (orderby != null)
523             {
524                 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
525             }
526             if (selector == null)
527             {
528                 return query.Cast<TResult>().AsNoTracking().ToList();
529             }
530             return query.Select(selector).AsNoTracking().ToList();
531         }
532 
533         /// <summary>
534         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回Object對象
535         /// </summary>
536         /// <typeparam name="TEntity">實體對象</typeparam>
537         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
538         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
539         /// <param name="orderby">排序字段</param>
540         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
541         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
542         /// <returns>自定義實體集合</returns>
543         public virtual List<object> QueryObject<TEntity, TOrderBy>
544             (Expression<Func<TEntity, bool>> where,
545             Expression<Func<TEntity, TOrderBy>> orderby,
546             Func<IQueryable<TEntity>,
547             List<object>> selector,
548             bool IsAsc)
549             where TEntity : class
550         {
551             IQueryable<TEntity> query = this.Context.Set<TEntity>();
552             if (where != null)
553             {
554                 query = query.Where(where);
555             }
556 
557             if (orderby != null)
558             {
559                 query = IsAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
560             }
561             if (selector == null)
562             {
563                 return query.AsNoTracking().ToList<object>();
564             }
565             return selector(query);
566         }
567 
568         /// <summary>
569         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回動態類對象
570         /// </summary>
571         /// <typeparam name="TEntity">實體對象</typeparam>
572         /// <typeparam name="TOrderBy">排序字段類型</typeparam>
573         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
574         /// <param name="orderby">排序字段</param>
575         /// <param name="selector">返回結果(必須是模型中存在的字段)</param>
576         /// <param name="IsAsc">排序方向,true為正序false為倒序</param>
577         /// <returns>動態類</returns>
578         public virtual dynamic QueryDynamic<TEntity, TOrderBy>
579             (Expression<Func<TEntity, bool>> where,
580             Expression<Func<TEntity, TOrderBy>> orderby,
581             Func<IQueryable<TEntity>,
582             List<object>> selector,
583             bool IsAsc)
584             where TEntity : class
585         {
586             List<object> list = QueryObject<TEntity, TOrderBy>
587                  (where, orderby, selector, IsAsc);
588             return Common.JsonConverter.JsonClass(list);
589         }
590         #endregion
591 
592         #region 分頁操作
593         /// <summary>
594         /// 待自定義分頁函數,使用必須重寫,指定數據模型
595         /// </summary>
596         public virtual IList<T1> PageByListSql<T1>(string sql, IList<DbParameter> parameters, Common.PageCollection page)
597         {
598             return null;
599         }
600         /// <summary>
601         /// 待自定義分頁函數,使用必須重寫,
602         /// </summary>
603         public virtual IList<T> PageByListSql(string sql, IList<DbParameter> parameters, Common.PageCollection page)
604         {
605             return null;
606         }
607 
608         /// <summary>
609         /// 對IQueryable對象進行分頁邏輯處理,過濾、查詢項、排序對IQueryable操作
610         /// </summary>
611         /// <param name="t">Iqueryable</param>
612         /// <param name="index">當前頁</param>
613         /// <param name="PageSize">每頁顯示多少條</param>
614         /// <returns>當前IQueryable to List的對象</returns>
615         public virtual Common.PageInfo<T> Query(IQueryable<T> query, int index, int PageSize)
616         {
617             if (index < 1)
618             {
619                 index = 1;
620             }
621             if (PageSize <= 0)
622             {
623                 PageSize = 20;
624             }
625             int count = query.Count();
626 
627             int maxpage = count / PageSize;
628 
629             if (count % PageSize > 0)
630             {
631                 maxpage++;
632             }
633             if (index > maxpage)
634             {
635                 index = maxpage;
636             }
637             if (count > 0)
638                 query = query.Skip((index - 1) * PageSize).Take(PageSize);
639             return new Common.PageInfo<T>(index, PageSize, count, query.ToList());
640         }
641         /// <summary>
642         /// 通用EF分頁,默認顯示20條記錄
643         /// </summary>
644         /// <typeparam name="TEntity">實體模型</typeparam>
645         /// <typeparam name="TOrderBy">排序類型</typeparam>
646         /// <param name="index">當前頁</param>
647         /// <param name="pageSize">顯示條數</param>
648         /// <param name="where">過濾條件</param>
649         /// <param name="orderby">排序字段</param>
650         /// <param name="selector">結果集合</param>
651         /// <param name="isAsc">排序方向true正序 false倒序</param>
652         /// <returns>自定義實體集合</returns>
653         public virtual Common.PageInfo<object> Query<TEntity, TOrderBy>
654             (int index, int pageSize,
655             Expression<Func<TEntity, bool>> where,
656             Expression<Func<TEntity, TOrderBy>> orderby,
657             Func<IQueryable<TEntity>,
658             List<object>> selector,
659             bool isAsc)
660             where TEntity : class
661         {
662             if (index < 1)
663             {
664                 index = 1;
665             }
666 
667             if (pageSize <= 0)
668             {
669                 pageSize = 20;
670             }
671 
672             IQueryable<TEntity> query = this.Context.Set<TEntity>();
673             if (where != null)
674             {
675                 query = query.Where(where);
676             }
677             int count = query.Count();
678 
679             int maxpage = count / pageSize;
680 
681             if (count % pageSize > 0)
682             {
683                 maxpage++;
684             }
685             if (index > maxpage)
686             {
687                 index = maxpage;
688             }
689 
690             if (orderby != null)
691             {
692                 query = isAsc ? query.OrderBy(orderby) : query.OrderByDescending(orderby);
693             }
694             if (count > 0)
695                 query = query.Skip((index - 1) * pageSize).Take(pageSize);
696             //返回結果為null,返回所有字段
697             if (selector == null)
698                 return new Common.PageInfo<object>(index, pageSize, count, query.ToList<object>());
699             return new Common.PageInfo<object>(index, pageSize, count, selector(query).ToList());
700         }
701         /// <summary>
702         /// 普通SQL查詢分頁方法
703         /// </summary>
704         /// <param name="index">當前頁</param>
705         /// <param name="pageSize">顯示行數</param>
706         /// <param name="tableName">表名/視圖</param>
707         /// <param name="field">獲取項</param>
708         /// <param name="filter">過濾條件</param>
709         /// <param name="orderby">排序字段+排序方向</param>
710         /// <param name="group">分組字段</param>
711         /// <returns>結果集</returns>
712         public virtual Common.PageInfo Query(int index, int pageSize, string tableName, string field, string filter, string orderby, string group, params DbParameter[] para)
713         {
714             //執行分頁算法
715             if (index <= 0)
716                 index = 1;
717             int start = (index - 1) * pageSize;
718             if (start > 0)
719                 start -= 1;
720             else
721                 start = 0;
722             int end = index * pageSize;
723 
724             #region 查詢邏輯
725             string logicSql = "SELECT";
726             //查詢項
727             if (!string.IsNullOrEmpty(field))
728             {
729                 logicSql += " " + field;
730             }
731             else
732             {
733                 logicSql += " *";
734             }
735             logicSql += " FROM (" + tableName + " ) where";
736             //過濾條件
737             if (!string.IsNullOrEmpty(filter))
738             {
739                 logicSql += " " + filter;
740             }
741             else
742             {
743                 filter = " 1=1";
744                 logicSql += "  1=1";
745             }
746             //分組
747             if (!string.IsNullOrEmpty(group))
748             {
749                 logicSql += " group by " + group;
750             }
751 
752             #endregion
753 
754             //獲取當前條件下數據總條數
755             int count = this.Context.Database.SqlQuery(typeof(int), "select count(*) from (" + tableName + ") where " + filter, para).Cast<int>().FirstOrDefault();
756             string sql = "SELECT T.* FROM ( SELECT B.* FROM ( SELECT A.*,ROW_NUMBER() OVER(ORDER BY getdate()) as RN" +
757                          logicSql + ") A ) B WHERE B.RN<=" + end + ") T WHERE T.RN>" + start;
758             //排序
759             if (!string.IsNullOrEmpty(orderby))
760             {
761                 sql += " order by " + orderby;
762             }
763             var list = ExecuteSqlQuery(sql, para) as IEnumerable;
764             if (list != null)
765                 return new Common.PageInfo(index, pageSize, count, list.Cast<object>().ToList());
766             return new Common.PageInfo(index, pageSize, count, new { });
767         }
768 
769         /// <summary>
770         /// 最簡單的SQL分頁
771         /// </summary>
772         /// <param name="index">頁碼</param>
773         /// <param name="pageSize">顯示行數</param>
774         /// <param name="sql">純SQL語句</param>
775         /// <param name="orderby">排序字段與方向</param>
776         /// <returns></returns>
777         public virtual Common.PageInfo Query(int index, int pageSize, string sql, string orderby, params DbParameter[] para)
778         {
779             return this.Query(index, pageSize, sql, null, null, orderby, null, para);
780         }
781         /// <summary>
782         /// 多表聯合分頁算法
783         /// </summary>
784         public virtual Common.PageInfo Query(IQueryable query, int index, int PageSize)
785         {
786             var enumerable = (query as System.Collections.IEnumerable).Cast<object>();
787             if (index < 1)
788             {
789                 index = 1;
790             }
791             if (PageSize <= 0)
792             {
793                 PageSize = 20;
794             }
795 
796             int count = enumerable.Count();
797 
798             int maxpage = count / PageSize;
799 
800             if (count % PageSize > 0)
801             {
802                 maxpage++;
803             }
804             if (index > maxpage)
805             {
806                 index = maxpage;
807             }
808             if (count > 0)
809                 enumerable = enumerable.Skip((index - 1) * PageSize).Take(PageSize);
810             return new Common.PageInfo(index, PageSize, count, enumerable.ToList());
811         }
812         #endregion
813 
814         #region ADO.NET增刪改查方法
815         /// <summary>
816         /// 執行增刪改方法,含事務處理
817         /// </summary>
818         public virtual object ExecuteSqlCommand(string sql, params DbParameter[] para)
819         {
820             try
821             {
822                 return this.Context.Database.ExecuteSqlCommand(sql, para);
823             }
824             catch (Exception e)
825             {
826                 throw e;
827             }
828 
829         }
830         /// <summary>
831         /// 執行多條SQL,增刪改方法,含事務處理
832         /// </summary>
833         public virtual object ExecuteSqlCommand(Dictionary<string, object> sqllist)
834         {
835             try
836             {
837                 int rows = 0;
838                 IEnumerator<KeyValuePair<string, object>> enumerator = sqllist.GetEnumerator();
839                 using (Transaction)
840                 {
841                     while (enumerator.MoveNext())
842                     {
843                         rows += this.Context.Database.ExecuteSqlCommand(enumerator.Current.Key, enumerator.Current.Value);
844                     }
845                     Commit();
846                 }
847                 return rows;
848             }
849             catch (Exception e)
850             {
851                 Rollback();
852                 throw e;
853             }
854 
855         }
856         /// <summary>
857         /// 執行查詢方法,返回動態類,接收使用var,遍歷時使用dynamic類型
858         /// </summary>
859         public virtual object ExecuteSqlQuery(string sql, params DbParameter[] para)
860         {
861             try
862             {
863                 return this.Context.Database.SqlQueryForDynamic(sql, para);
864             }
865             catch (Exception e)
866             {
867                 throw e;
868             }
869         }
870         #endregion
871     }
872 }
View Code

 

 

需要用的Common公共幫助類

這寫類庫,大家去【C#公共幫助類】找一下。有些公共幫助類,我還沒來得及發布,請大家耐心等待一下哈~~~理解、理解~~

PS1:大家的實現類 是不是找不到SqlFunctionForDynamic 這個方法,這是我的失誤,因為剛才有點工作的事,忘記了,現在補充上

我們在Service類庫下面新建一個 查詢動態類 DatabaseExtensions

 

 

代碼如下:添加上這個類之后 那個方法就有了

 

  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Configuration;
  5 using System.Data;
  6 using System.Data.Entity;
  7 using System.Linq;
  8 using System.Reflection;
  9 using System.Reflection.Emit;
 10 using System.Text;
 11 
 12 namespace Service
 13 {
 14     /// <summary>
 15     /// 查詢動態類
 16     /// add yuangang by 2016-05-10
 17     /// </summary>
 18     public static class DatabaseExtensions
 19     {
 20         /// <summary>
 21         /// 自定義Connection對象
 22         /// </summary>
 23         private static IDbConnection DefaultConnection 
 24         {
 25             get
 26             {
 27                 return Domain.MyConfig.DefaultConnection;
 28             }
 29         }
 30         /// <summary>
 31         /// 自定義數據庫連接字符串,與EF連接模式一致
 32         /// </summary>
 33         private static string DefaultConnectionString 
 34         {
 35             get 
 36             {
 37                 return Domain.MyConfig.DefaultConnectionString;
 38             }
 39         }
 40         /// <summary>
 41         /// 動態查詢主方法
 42         /// </summary>
 43         /// <returns></returns>
 44         public static IEnumerable SqlQueryForDynamic(this Database db,
 45                 string sql,
 46                 params object[] parameters)
 47         {
 48             IDbConnection defaultConn = DefaultConnection;
 49 
 50             //ADO.NET數據庫連接字符串
 51             db.Connection.ConnectionString = DefaultConnectionString;
 52 
 53             return SqlQueryForDynamicOtherDB(db, sql, defaultConn, parameters);
 54         }
 55         private static IEnumerable SqlQueryForDynamicOtherDB(this Database db,  string sql, IDbConnection conn, params object[] parameters)
 56         {
 57             conn.ConnectionString = db.Connection.ConnectionString;
 58 
 59             if (conn.State != ConnectionState.Open)
 60             {
 61                 conn.Open();
 62             }
 63 
 64             IDbCommand cmd = conn.CreateCommand();
 65             cmd.CommandText = sql;
 66             if (parameters != null)
 67             {
 68                 foreach (var item in parameters)
 69                 {
 70                     cmd.Parameters.Add(item);
 71                 }
 72             }
 73 
 74             using (IDataReader dataReader = cmd.ExecuteReader())
 75             {
 76 
 77                 if (!dataReader.Read())
 78                 {
 79                     return null; //無結果返回Null
 80                 }
 81 
 82                 #region 構建動態字段
 83 
 84                 TypeBuilder builder = DatabaseExtensions.CreateTypeBuilder(
 85                     "EF_DynamicModelAssembly",
 86                     "DynamicModule",
 87                     "DynamicType");
 88 
 89                 int fieldCount = dataReader.FieldCount;
 90                 for (int i = 0; i < fieldCount; i++)
 91                 {
 92                     Type t = dataReader.GetFieldType(i);
 93                     switch (t.Name.ToLower())
 94                     {
 95                         case "decimal":
 96                             t = typeof(Decimal?);
 97                             break;
 98                         case "double":
 99                             t = typeof(Double?);
100                             break;
101                         case "datetime":
102                             t = typeof(DateTime?);
103                             break;
104                         case "single":
105                             t = typeof(float?);
106                             break;
107                         case "int16":
108                             t = typeof(int?);
109                             break;
110                         case "int32":
111                             t = typeof(int?);
112                             break;
113                         case "int64":
114                             t = typeof(int?);
115                             break;
116                         default:
117                             break;
118                     }
119                     DatabaseExtensions.CreateAutoImplementedProperty(
120                         builder,
121                         dataReader.GetName(i),
122                         t);
123                 }
124 
125                 #endregion
126 
127                 cmd.Parameters.Clear();
128                 dataReader.Close();
129                 dataReader.Dispose();
130                 cmd.Dispose();
131                 conn.Close();
132                 conn.Dispose();
133 
134                 Type returnType = builder.CreateType();
135 
136                 if (parameters != null)
137                 {
138                     return db.SqlQuery(returnType, sql, parameters);
139                 }
140                 else
141                 {
142                     return db.SqlQuery(returnType, sql);
143                 }
144             }
145         }
146 
147         private static TypeBuilder CreateTypeBuilder(string assemblyName, string moduleName, string typeName)
148         {
149             TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
150               new AssemblyName(assemblyName),
151               AssemblyBuilderAccess.Run).DefineDynamicModule(moduleName).DefineType(typeName,
152               TypeAttributes.Public);
153             typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
154             return typeBuilder;
155         }
156 
157         private static void CreateAutoImplementedProperty(TypeBuilder builder, string propertyName, Type propertyType)
158         {
159             const string PrivateFieldPrefix = "m_";
160             const string GetterPrefix = "get_";
161             const string SetterPrefix = "set_";
162 
163             // Generate the field.
164             FieldBuilder fieldBuilder = builder.DefineField(
165               string.Concat(
166                 PrivateFieldPrefix, propertyName),
167               propertyType,
168               FieldAttributes.Private);
169 
170             // Generate the property
171             PropertyBuilder propertyBuilder = builder.DefineProperty(
172               propertyName,
173               System.Reflection.PropertyAttributes.HasDefault,
174               propertyType, null);
175 
176             // Property getter and setter attributes.
177             MethodAttributes propertyMethodAttributes = MethodAttributes.Public
178               | MethodAttributes.SpecialName
179               | MethodAttributes.HideBySig;
180 
181             // Define the getter method.
182             MethodBuilder getterMethod = builder.DefineMethod(
183                 string.Concat(
184                   GetterPrefix, propertyName),
185                 propertyMethodAttributes,
186                 propertyType,
187                 Type.EmptyTypes);
188 
189             // Emit the IL code.
190             // ldarg.0
191             // ldfld,_field
192             // ret
193             ILGenerator getterILCode = getterMethod.GetILGenerator();
194             getterILCode.Emit(OpCodes.Ldarg_0);
195             getterILCode.Emit(OpCodes.Ldfld, fieldBuilder);
196             getterILCode.Emit(OpCodes.Ret);
197 
198             // Define the setter method.
199             MethodBuilder setterMethod = builder.DefineMethod(
200               string.Concat(SetterPrefix, propertyName),
201               propertyMethodAttributes,
202               null,
203               new Type[] { propertyType });
204 
205             // Emit the IL code.
206             // ldarg.0
207             // ldarg.1
208             // stfld,_field
209             // ret
210             ILGenerator setterILCode = setterMethod.GetILGenerator();
211             setterILCode.Emit(OpCodes.Ldarg_0);
212             setterILCode.Emit(OpCodes.Ldarg_1);
213             setterILCode.Emit(OpCodes.Stfld, fieldBuilder);
214             setterILCode.Emit(OpCodes.Ret);
215 
216             propertyBuilder.SetGetMethod(getterMethod);
217             propertyBuilder.SetSetMethod(setterMethod);
218         }
219 
220         public static dynamic SqlFunctionForDynamic(this Database db,
221                 string sql,
222                 params object[] parameters)
223         {
224             IDbConnection conn = DefaultConnection;
225 
226             //ADO.NET數據庫連接字符串
227             conn.ConnectionString = DefaultConnectionString;
228 
229             if (conn.State != ConnectionState.Open)
230             {
231                 conn.Open();
232             }
233 
234             IDbCommand cmd = conn.CreateCommand();
235             cmd.CommandText = sql;
236             cmd.CommandType = CommandType.StoredProcedure;
237             if (parameters != null)
238             {
239                 foreach (var item in parameters)
240                 {
241                     cmd.Parameters.Add(item);
242                 }
243             }
244             //1、DataReader查詢數據
245             using (IDataReader dataReader = cmd.ExecuteReader())
246             {
247                 if (!dataReader.Read())
248                 {
249                     return null;
250                 }
251                 //2、DataReader轉換Json
252                 string jsonstr = Common.JsonConverter.ToJson(dataReader);
253                 dataReader.Close();
254                 dataReader.Dispose();
255                 cmd.Dispose();
256                 conn.Close();
257                 conn.Dispose();
258                 //3、Json轉換動態類
259                 dynamic dyna = Common.JsonConverter.ConvertJson(jsonstr);
260                 return dyna;
261             }
262         }
263         /// <summary>
264         /// 對可空類型進行判斷轉換(*要不然會報錯)
265         /// </summary>
266         /// <param name="value">DataReader字段的值</param>
267         /// <param name="conversionType">該字段的類型</param>
268         /// <returns></returns>
269         private static object CheckType(object value, Type conversionType)
270         {
271             if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
272             {
273                 if (value == null)
274                     return null;
275                 System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);
276                 conversionType = nullableConverter.UnderlyingType;
277             }
278             return Convert.ChangeType(value, conversionType);
279         }
280 
281         /// <summary>
282         /// 判斷指定對象是否是有效值
283         /// </summary>
284         /// <param name="obj"></param>
285         /// <returns></returns>
286         private static bool IsNullOrDBNull(object obj)
287         {
288             return (obj == null || (obj is DBNull)) ? true : false;
289         }
290     }
291 }
View Code

 

 

 

 

原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM