前段时间一直在忙着处理一个B2C的商城项目,未来得整理这次项目的心得,今天偶有空闲便写下这篇文章以记录整个项目的设计及自我总结。
这个项目是我综合传智播客教学基础将传统三层架构与EntityFramework进行整合,其中如有不对之处,还望各位高手指点。
一、项目结构:经典三层+EF
首先,先说说整个项目的结构。该项目使用 Visual Studio2013+EF4.4 来进行开发,可能有同学会说,EF6都出来了,为什么还使用4.4版本?
原因二、windows 2003 只支持到 .net 4.0
API:主要用于支持第三方扩展,比如支付和登录。
BLL层:业务逻辑处理层。
Common:公用方法封装。
DAL层:数据访问层。
DBSessionFactory:数据访问会话层,主要用于DAL和数据库之间的连接。
DBUtility:常规三层中ADO.Net 方式与数据库的连接。
Interface:封装了BLL调用DAL中的IBLL接口,及DAL中方法调用DBSession时其中的基本的CURD的方法的接口。
Web.UI:表现层与业务逻辑层之间调用方法的封装。
Web:表现层。数据来源于UI及BLL层中。
二、数据库主要结构
主要表结构设计为:订单模块、会员模块、商品模块、文章模块、后台管理模块和其他一些表的设计。
三、各个模块的功能介绍
1.DBSessionFactory模块。
DBsession主要用于数据库的交互,进行保存数据或者查询数据。
1 /// <summary> 2 /// 封装的数据操作类 3 /// </summary> 4 public partial class DBSession 5 { 6 /// <summary> 7 /// EF上下文对象,由工厂创建 8 /// </summary> 9 DbContext dbContext=TDB2C.DbContextFacory.DbContextFactory.GetDbContext();10 /// <summary>11 /// 执行特殊SQL语句或存储过程12 /// </summary>13 /// <param name="sql">Sql语句或存储过程</param>14 /// <param name="parameters">参数数组</param>15 /// <returns>返回影响行数</returns>16 public int ExecutNoneQuery(string sql, SqlParameter[] parameters)17 {18 return dbContext.Database.ExecuteSqlCommand(sql, parameters);19 }20 /// <summary>21 /// 执行SQL语句,返回指定类型的对象集合22 /// </summary>23 /// <typeparam name="T"></typeparam>24 /// <param name="sql"></param>25 /// <param name="parameters"></param>26 /// <returns></returns>27 public List<T> ExecutDataTable<T>(string sql, SqlParameter[] parameters)28 {29 return dbContext.Database.SqlQuery<T>(sql, parameters).ToList();30 }31 /// <summary>32 /// 将所有操作一次性保存会数据库,避免频繁连接和操作数据库33 /// </summary>34 /// <returns></returns>35 public int SaveChanges()36 {37 try38 {39 return dbContext.SaveChanges();40 }41 catch(Exception ex)42 {43 TDB2C.Common.LogHelper.LogFatal(ex.Message, ex);44 throw ex;45 }46 }47 }
AbstructFacotry.tt 主要用于反射出 DAL对象与DBSession层之间的 IDAL 对象。
2.Interface中两个接口。
IDAL 接口: 将数据库中的常用方法进行抽象。具体实现交给DAL层来完成。
1 public interface IBaseDAL<T> where T:class,new() 2 { 3 /// <summary> 4 /// 根据条件,获取当个对象,带排序 5 /// </summary> 6 T LoadEntity(Expression<Func<T, bool>> whereLambda, params OrderModelField[] orderByExpression); 7 /// <summary> 8 /// 获取满足条件的所有数据 9 /// </summary> 10 IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda, params OrderModelField[] orderByExpression); 11 /// <summary> 12 /// 获取前几条数据,根据条件,排序条件,数量 13 /// </summary> 14 IQueryable<T> LoadEntities(int top, Expression<Func<T, bool>> whereLambda, params OrderModelField[] orderByExpression); 15 /// <summary> 16 /// 获取分页数据,根据过滤条件,排序条件,页码,页容量, 17 /// </summary> 18 IQueryable<T> LoadEntities(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, params OrderModelField[] orderByExpression); 19 /// <summary> 20 /// 增加新实体 21 /// </summary> 22 T AddEntity(T entity); 23 /// <summary> 24 /// 删除该实体 25 /// </summary> 26 void DeleteEntity(T entity); 27 /// <summary> 28 /// 修改实体 29 /// </summary> 30 void UpdateEntity(T entity); 31 32 #region 聚合函数 33 /// <summary> 34 /// 统计合计,若统计字段中包含null值,则不计入运算结果 35 /// </summary> 36 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 37 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 38 /// <returns>返回合计值</returns> 39 int? GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda); 40 /// <summary> 41 /// 统计合计,若统计字段中包含null值,则不计入运算结果 42 /// </summary> 43 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 44 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 45 /// <returns>返回合计值</returns> 46 decimal? GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda); 47 /// <summary> 48 /// 获得最大值,若统计字段中包含null值,则不计入运算结果 49 /// </summary> 50 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 51 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 52 /// <returns>返回最大值</returns> 53 int? GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda); 54 /// <summary> 55 /// 获得最大值,若统计字段中包含null值,则不计入运算结果 56 /// </summary> 57 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 58 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 59 /// <returns>返回最大值</returns> 60 decimal? GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda); 61 /// <summary> 62 /// 获得最小值,若统计字段中包含null值,则不计入运算结果 63 /// </summary> 64 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 65 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 66 /// <returns>返回最小值</returns> 67 int? GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda); 68 /// <summary> 69 /// 获得最小值,若统计字段中包含null值,则不计入运算结果 70 /// </summary> 71 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 72 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 73 /// <returns>返回最小值</returns> 74 decimal? GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda); 75 /// <summary> 76 /// 获得平均值,若统计字段中包含null值,则不计入运算结果 77 /// </summary> 78 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 79 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 80 /// <returns>返回平均值</returns> 81 int? GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda); 82 /// <summary> 83 /// 获得平均值,若统计字段中包含null值,则不计入运算结果 84 /// </summary> 85 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 86 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 87 /// <returns>返回平均值</returns> 88 decimal? GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda); 89 90 91 92 /// <summary> 93 /// 统计合计,若统计字段中包含null值,则抛异常 94 /// </summary> 95 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 96 /// <param name="fieldLambda">选择字段的 Lambda表达式</param> 97 /// <returns>返回合计值</returns> 98 int GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda); 99 /// <summary>100 /// 统计合计,若统计字段中包含null值,则抛异常101 /// </summary>102 /// <param name="whereLambda">过滤条件 Lambda表达式</param>103 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>104 /// <returns>返回合计值</returns>105 decimal GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);106 /// <summary>107 /// 获得最大值,若统计字段中包含null值,则抛异常108 /// </summary>109 /// <param name="whereLambda">过滤条件 Lambda表达式</param>110 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>111 /// <returns>返回最大值</returns>112 int GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);113 /// <summary>114 /// 获得最大值,若统计字段中包含null值,则抛异常115 /// </summary>116 /// <param name="whereLambda">过滤条件 Lambda表达式</param>117 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>118 /// <returns>返回最大值</returns>119 decimal GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);120 /// <summary>121 /// 获得最小值,若统计字段中包含null值,则抛异常122 /// </summary>123 /// <param name="whereLambda">过滤条件 Lambda表达式</param>124 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>125 /// <returns>返回最小值</returns>126 int GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);127 /// <summary>128 /// 获得最小值,若统计字段中包含null值,则抛异常129 /// </summary>130 /// <param name="whereLambda">过滤条件 Lambda表达式</param>131 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>132 /// <returns>返回最小值</returns>133 decimal GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);134 /// <summary>135 /// 获得平均值,若统计字段中包含null值,则抛异常136 /// </summary>137 /// <param name="whereLambda">过滤条件 Lambda表达式</param>138 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>139 /// <returns>返回平均值</returns>140 int GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);141 /// <summary>142 /// 获得平均值,若统计字段中包含null值,则抛异常143 /// </summary>144 /// <param name="whereLambda">过滤条件 Lambda表达式</param>145 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>146 /// <returns>返回平均值</returns>147 decimal GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);148 149 150 151 152 /// <summary>153 /// 获得指定条件统计结果154 /// </summary>155 /// <param name="whereLambda">过滤条件 Lambda表达式</param>156 /// <returns></returns>157 int GetCount(Expression<Func<T, bool>> whereLambda);158 159 #endregion160 161 /// <summary>162 /// 查找是否存在163 /// </summary>164 bool ExistsEntity(Expression<Func<T, bool>> whereLabmda);165 /// <summary>166 /// 查找是否存在167 /// </summary>168 bool ExistsEntity(int id);169 }
IBLL接口: 将IDAL中的方法进行扩充,然后交给BLL中去具体实现。
1 /// <summary> 2 /// 业务逻辑接口层(Business Logic Layer InterFace),供表现层和业务逻辑层使用 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 public interface IBaseBLL<T> where T:class,new() 6 { 7 8 /// <summary> 9 /// 获取指定对象,根据主键Id 10 /// </summary> 11 /// <param name="id">主键</param> 12 /// <returns>获取到的对象,不存在则为Null</returns> 13 T LoadEntity(int id); 14 /// <summary> 15 /// 获取指定对象,根据过滤条件字符串 16 /// </summary> 17 /// <param name="strWhere">过滤条件 where条件字符串</param> 18 /// <returns>获取到的对象,不存在则为Null</returns> 19 T LoadEntity(string strWhere); 20 /// <summary> 21 /// 获取指定对象,根据过滤条件字符串,带排序 22 /// </summary> 23 /// <param name="strWhere">过滤条件 where条件字符串</param> 24 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 25 /// <returns>获取到的对象,不存在则为Null</returns> 26 T LoadEntity(string strWhere, string fieldOrder); 27 /// <summary> 28 /// 获取指定对象,根据过滤条件Lambda表达式 29 /// </summary> 30 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 31 /// <returns>获取到的对象,不存在则为Null</returns> 32 T LoadEntity(Expression<Func<T, bool>> whereLambda); 33 /// <summary> 34 /// 获取指定对象,根据过滤条件Lambda表达式,带排序 35 /// </summary> 36 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 37 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 38 /// <returns>获取到的对象,不存在则为Null</returns> 39 T LoadEntity(Expression<Func<T, bool>> whereLambda, string fieldOrder); 40 41 /// <summary> 42 /// 获取对象集合,根据过滤条件字符串 43 /// </summary> 44 /// <param name="strWhere">过滤条件 where条件字符串</param> 45 /// <returns>获取到的对象集合,不存在则为new List()</returns> 46 List<T> LoadEntities(string strWhere); 47 /// <summary> 48 /// 获取对象集合,根据过滤条件字符串,带排序 49 /// </summary> 50 /// <param name="strWhere">过滤条件 where条件字符串</param> 51 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 52 /// <returns>获取到的对象集合,不存在则为new List()</returns> 53 List<T> LoadEntities(string strWhere, string fieldOrder); 54 55 /// <summary> 56 /// 获取对象集合,根据过滤条件Lambda表达式 57 /// </summary> 58 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 59 /// <returns>获取到的对象集合,不存在则为new List()</returns> 60 List<T> LoadEntities(Expression<Func<T, bool>> whereLambda); 61 /// <summary> 62 /// 获取对象集合,根据过滤条件Lambda表达式,带排序 63 /// </summary> 64 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 65 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 66 /// <returns>获取到的对象集合,不存在则为new List()</returns> 67 List<T> LoadEntities(Expression<Func<T, bool>> whereLambda, string fieldOrder); 68 69 /// <summary> 70 /// 获取前几条对象集合,根据过滤条件字符串 71 /// </summary> 72 /// <param name="top">指定记录数</param> 73 /// <param name="strWhere">过滤条件 where条件字符串</param> 74 /// <returns>获取到的对象集合,不存在则为new List()</returns> 75 List<T> LoadEntities(int top, string strWhere); 76 /// <summary> 77 /// 获取前几条对象集合,根据过滤条件字符串,带排序 78 /// </summary> 79 /// <param name="top">指定记录数</param> 80 /// <param name="strWhere">过滤条件 where条件字符串</param> 81 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 82 /// <returns>获取到的对象集合,不存在则为new List()</returns> 83 List<T> LoadEntities(int top, string strWhere, string fieldOrder); 84 85 /// <summary> 86 /// 获取前几条对象集合,根据过滤条件Lambda表达式 87 /// </summary> 88 /// <param name="top">指定记录数</param> 89 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 90 /// <returns>获取到的对象集合,不存在则为new List()</returns> 91 List<T> LoadEntities(int top, Expression<Func<T, bool>> whereLambda); 92 /// <summary> 93 /// 获取前几条对象集合,根据过滤条件Lambda表达式,带排序 94 /// </summary> 95 /// <param name="top">指定记录数</param> 96 /// <param name="whereLambda">过滤条件 Lambda表达式</param> 97 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param> 98 /// <returns>获取到的对象集合,不存在则为new List()</returns> 99 List<T> LoadEntities(int top, Expression<Func<T, bool>> whereLambda, string fieldOrder);100 101 /// <summary>102 /// 获取分页对象集合,根据过滤条件字符串103 /// </summary>104 /// <param name="pageIndex">当前页码</param>105 /// <param name="pageSize">页容量</param>106 /// <param name="totalCount">总记录数</param>107 /// <param name="strWhere">过滤条件 where条件字符串</param>108 /// <returns>获取到的对象集合,不存在则为new List()</returns>109 List<T> LoadEntities(int pageIndex, int pageSize, out int totalCount, string strWhere);110 /// <summary>111 /// 获取分页对象集合,根据过滤条件字符串,带排序112 /// </summary>113 /// <param name="pageIndex">当前页码</param>114 /// <param name="pageSize">页容量</param>115 /// <param name="totalCount">总记录数</param>116 /// <param name="strWhere">过滤条件 where条件字符串</param>117 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param>118 /// <returns>获取到的对象集合,不存在则为new List()</returns>119 List<T> LoadEntities(int pageIndex, int pageSize, out int totalCount, string strWhere, string fieldOrder);120 121 /// <summary>122 /// 获取分页对象集合,根据过滤条件Lambda表达式123 /// </summary>124 /// <param name="pageIndex">当前页码</param>125 /// <param name="pageSize">页容量</param>126 /// <param name="totalCount">总记录数</param>127 /// <param name="whereLambda">过滤条件 Lambda表达式</param>128 /// <returns>获取到的对象集合,不存在则为new List()</returns>129 List<T> LoadEntities(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda);130 /// <summary>131 /// 获取分页对象集合,根据过滤条件Lambda表达式,带排序132 /// </summary>133 /// <param name="pageIndex">当前页码</param>134 /// <param name="pageSize">页容量</param>135 /// <param name="totalCount">总记录数</param>136 /// <param name="whereLambda">过滤条件 Lambda表达式</param>137 /// <param name="fieldOrder">排序字符串 格式为:"id desc" 或者 "sort_id asc,add_time desc,....,id asc" 或者""</param>138 /// <returns>获取到的对象集合,不存在则为new List()</returns>139 List<T> LoadEntities(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda, string fieldOrder);140 141 142 /// <summary>143 /// 添加新实体,返回刚添加的实体144 /// </summary>145 /// <param name="entity">要添加的实体</param>146 /// <returns>返回的添加成功后的实体</returns>147 T AddEntity(T entity);148 /// <summary>149 /// 添加实体,返回添加成功的实体及成功数量150 /// </summary>151 /// <param name="entity">要添加的实体</param>152 /// <param name="changes">成功记录数</param>153 /// <returns>返回添加成功后的实体</returns>154 T AddEntity(T entity, out int changes);155 /// <summary>156 /// 添加实体,返回添加成功的数量157 /// </summary>158 /// <param name="entity">要添加的实体</param>159 /// <returns>添加成功的数量</returns>160 int AddEntityChanges(T entity);161 162 /// <summary>163 /// 更新实体,返回是否成功164 /// </summary>165 /// <param name="entity">要更新的实体</param>166 /// <returns>成功状态 true为成功,false为失败</returns>167 bool UpdateEntity(T entity);168 169 /// <summary>170 /// 查找是否存在171 /// </summary>172 /// <param name="whereLabmda">过滤条件 Lambda表达式</param>173 /// <returns>存在状态 true为存在,false为不存在</returns>174 bool ExistsEntity(Expression<Func<T, bool>> whereLabmda);175 /// <summary>176 /// 查找是否存在177 /// </summary>178 /// <param name="strWhere">过滤条件 where条件字符串</param>179 /// <returns>存在状态 true为存在,false为不存在</returns>180 bool ExistsEntity(string strWhere);181 /// <summary>182 /// 查找是否存在183 /// </summary>184 /// <param name="id">对象主键Id</param>185 /// <returns>存在状态 true为存在,false为不存在</returns>186 bool ExistsEntity(int id);187 188 /// <summary>189 /// 修改指定对象的(一个或多个)字段值190 /// </summary>191 /// <param name="id">主键Id</param>192 /// <param name="strValue">字段值,格式必须为"key=value"或"key1=value1&&key2=value2&&...&&keyN=valueN"</param>193 /// <returns>返回成功状态 true为成功,false为失败</returns>194 bool UpdateFieldsEntity(int id, string strValue);195 /// <summary>196 /// 修改满足条件的所有对象的(一个或多个)字段值197 /// </summary>198 /// <param name="whereLambda">过滤条件 Lambda表达式</param>199 /// <param name="strValue">字段值,格式必须为"key=value"或"key1=value1&&key2=value2&&...&&keyN=valueN"</param>200 /// <returns>返回成功状态 true为成功,false为失败</returns>201 bool UpdateFieldsEntity(Expression<Func<T, bool>> whereLambda, string strValue);202 /// <summary>203 /// 根据条件,修改满足条件的所以的对象的(一个或多个)字段值204 /// </summary>205 /// <param name="strWhere">过滤条件 where条件字符串</param>206 /// <param name="strValue">字段值,格式必须为"key=value"或"key1=value1&&key2=value2&&...&&keyN=valueN"</param>207 /// <returns>返回成功状态 true为成功,false为失败</returns>208 bool UpdateFieldsEntity(string strWhere, string strValue);209 210 /// <summary>211 /// 软删除实体212 /// </summary>213 /// <param name="id">主键Id</param>214 /// <returns>返回成功状态 true为成功,false为失败</returns>215 bool DeleteSoftEntity(int id);216 /// <summary>217 /// 软删除实体,删除满足Lambda条件的实体对象218 /// </summary>219 /// <param name="whereLambda">过滤条件 Lambda表达式</param>220 /// <returns>返回成功状态 true为成功,false为失败</returns>221 bool DeleteSoftEntity(Expression<Func<T, bool>> whereLambda);222 /// <summary>223 /// 软删除实体,删除满足条件的实体对象224 /// </summary>225 /// <param name="strWhere">过滤条件 where条件字符串</param>226 /// <returns>返回成功状态 true为成功,false为失败</returns>227 bool DeleteSoftEntity(string strWhere);228 229 /// <summary>230 /// 真删除实体231 /// </summary>232 /// <param name="id">主键Id</param>233 /// <returns>返回成功状态 true为成功,false为失败</returns>234 bool DeleteEntity(int id);235 /// <summary>236 /// 真删除实体,删除满足Lambda条件的实体对象237 /// </summary>238 /// <param name="whereLambda">过滤条件 Lambda表达式</param>239 /// <returns>返回成功状态 true为成功,false为失败</returns>240 bool DeleteEntity(Expression<Func<T, bool>> whereLambda);241 /// <summary>242 /// 真删除实体,返回是否成功243 /// </summary>244 /// <param name="entity">要删除的实体</param>245 /// <returns>成功状态 true为成功,false为失败</returns>246 bool DeleteEntity(T entity);247 /// <summary>248 /// 真删除实体,返回是否成功249 /// </summary>250 /// <param name="strWhere">过滤条件 where条件字符串</param>251 /// <returns>成功状态 true为成功,false为失败</returns>252 bool DeleteEntity(string strWhere);253 #region 聚合函数254 255 /// <summary>256 /// 统计合计,若统计字段中包含null值,则不计入运算结果257 /// </summary>258 /// <param name="whereLambda">过滤条件 Lambda表达式</param>259 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>260 /// <returns>返回合计值</returns>261 int? GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda);262 /// <summary>263 /// 统计合计,若统计字段中包含null值,则不计入运算结果264 /// </summary>265 /// <param name="whereLambda">过滤条件 Lambda表达式</param>266 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>267 /// <returns>返回合计值</returns>268 decimal? GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda);269 /// <summary>270 /// 获得最大值,若统计字段中包含null值,则不计入运算结果271 /// </summary>272 /// <param name="whereLambda">过滤条件 Lambda表达式</param>273 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>274 /// <returns>返回最大值</returns>275 int? GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda);276 /// <summary>277 /// 获得最大值,若统计字段中包含null值,则不计入运算结果278 /// </summary>279 /// <param name="whereLambda">过滤条件 Lambda表达式</param>280 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>281 /// <returns>返回最大值</returns>282 decimal? GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda);283 /// <summary>284 /// 获得最小值,若统计字段中包含null值,则不计入运算结果285 /// </summary>286 /// <param name="whereLambda">过滤条件 Lambda表达式</param>287 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>288 /// <returns>返回最小值</returns>289 int? GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda);290 /// <summary>291 /// 获得最小值,若统计字段中包含null值,则不计入运算结果292 /// </summary>293 /// <param name="whereLambda">过滤条件 Lambda表达式</param>294 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>295 /// <returns>返回最小值</returns>296 decimal? GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda);297 /// <summary>298 /// 获得平均值,若统计字段中包含null值,则不计入运算结果299 /// </summary>300 /// <param name="whereLambda">过滤条件 Lambda表达式</param>301 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>302 /// <returns>返回平均值</returns>303 int? GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int?>> fieldLambda);304 /// <summary>305 /// 获得平均值,若统计字段中包含null值,则不计入运算结果306 /// </summary>307 /// <param name="whereLambda">过滤条件 Lambda表达式</param>308 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>309 /// <returns>返回平均值</returns>310 decimal? GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal?>> fieldLambda);311 312 313 /// <summary>314 /// 统计合计,若统计字段中包含null值,则抛异常315 /// </summary>316 /// <param name="whereLambda">过滤条件 Lambda表达式</param>317 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>318 /// <returns>返回合计值</returns>319 int GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);320 /// <summary>321 /// 统计合计,若统计字段中包含null值,则抛异常322 /// </summary>323 /// <param name="whereLambda">过滤条件 Lambda表达式</param>324 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>325 /// <returns>返回合计值</returns>326 decimal GetSum(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);327 /// <summary>328 /// 获得最大值,若统计字段中包含null值,则抛异常329 /// </summary>330 /// <param name="whereLambda">过滤条件 Lambda表达式</param>331 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>332 /// <returns>返回最大值</returns>333 int GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);334 /// <summary>335 /// 获得最大值,若统计字段中包含null值,则抛异常336 /// </summary>337 /// <param name="whereLambda">过滤条件 Lambda表达式</param>338 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>339 /// <returns>返回最大值</returns>340 decimal GetMax(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);341 /// <summary>342 /// 获得最小值,若统计字段中包含null值,则抛异常343 /// </summary>344 /// <param name="whereLambda">过滤条件 Lambda表达式</param>345 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>346 /// <returns>返回最小值</returns>347 int GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);348 /// <summary>349 /// 获得最小值,若统计字段中包含null值,则抛异常350 /// </summary>351 /// <param name="whereLambda">过滤条件 Lambda表达式</param>352 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>353 /// <returns>返回最小值</returns>354 decimal GetMin(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);355 /// <summary>356 /// 获得平均值,若统计字段中包含null值,则抛异常357 /// </summary>358 /// <param name="whereLambda">过滤条件 Lambda表达式</param>359 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>360 /// <returns>返回平均值</returns>361 int GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, int>> fieldLambda);362 /// <summary>363 /// 获得平均值,若统计字段中包含null值,则抛异常364 /// </summary>365 /// <param name="whereLambda">过滤条件 Lambda表达式</param>366 /// <param name="fieldLambda">选择字段的 Lambda表达式</param>367 /// <returns>返回平均值</returns>368 decimal GetAverage(Expression<Func<T, bool>> whereLambda, Expression<Func<T, decimal>> fieldLambda);369 /// <summary>370 /// 根据条件获得记录数371 /// </summary>372 /// <param name="whereLambda">过滤条件 Lambda表达式</param>373 /// <returns>记录数</returns>374 int GetCount(Expression<Func<T, bool>> whereLambda);375 /// <summary>376 /// 根据条件获得记录数377 /// </summary>378 /// <param name="strWhere">过滤条件 where字符串</param>379 /// <returns>记录数</returns>380 int GetCount(string strWhere);381 #endregion382 }
3.DAL层
DAL层中,定义了泛型约束的基类,所有的Model 继承BaseDAL,里面显示实现了所有的IDAL,具体实现就不贴出来了。
1 public class BaseDAL<T> where T:class,new()2 {3 //代码的具体实现...4 }
4.同样的BLL层中 也是定义相同的泛型约束基类,所有的Model继承BaseBLL,显示实现所有IBLL中定义的方法。
1 public class BaseBLL<T> where T:class,new()2 {3 //代码的具体实现...4 }
四、总结
这次的项目EntityFrameWork的使用方式依然是 DBFirst模式,在数据库中建立表结构之后,生成对应的Model,这里我将原始的T4文件进行了修改,支持将数据库中表名称,字段备注说明,一并生成到Model中,如:
1 /// <summary> 2 /// 商品评论参数 标签表 3 /// </summary> 4 [Serializable] 5 public partial class Product_comment_merit:IModel 6 { 7 public Product_comment_merit() 8 { 9 this.Id=0;10 this.Product_category_ids="";11 this.Title="";12 this.Sort_id=0;13 this.Add_time=DateTime.Now;14 this.Is_del=0;15 }16 17 /// <summary>18 /// 主键Id19 /// </summary>20 public int Id { get; set; }21 /// <summary>22 /// 所属分类23 /// </summary>24 public string Product_category_ids { get; set; }25 /// <summary>26 /// 标题27 /// </summary>28 public string Title { get; set; }29 /// <summary>30 /// 排序31 /// </summary>32 public int Sort_id { get; set; }33 /// <summary>34 /// 添加时间35 /// </summary>36 public DateTime Add_time { get; set; }37 /// <summary>38 /// 删除标识39 /// </summary>40 public int Is_del { get; set; }41 }
model.tt文件,将数据库中的关系,映射成C#中的model,并保留字段备注,表说明。
所有BLL中的类,都继承了BaseBLL,所以每一个业务逻辑都有IBLL中的 52个方法,这些方法基本涵盖了所有常规的数据操作。
自己所特有的业务逻辑在单独编写,因为T4模版生成出来的Class 都是partial 的。
整体实现的功能为, 新建立某个关系模型,重新运行T4模版文件,则 就拥有了该对象的 IBLL中的 52个常用 CRUD的方法。