交流群:863563315 

     常规的中小型项目搭建方式一般是三层架构加上mvc与webapi作为一个主要框架,再加上一些第三方库,例如orm框架(EF、SqlSugar、Dapper等),API文档工具(Swagger)这些的应用。

  接下来我们以一个数据管理平台做为实战项目来演示三层架构与仓储模式。

  项目Github连接:

https://github.com/FaithGuo/DataManager

  一、项目创建

  首先搭建以下目录结构

1. 数据持久接口:IDAL

2.数据持久实现:DAL

3.业务逻辑接口:IBLL

4.业务逻辑实现:BLL

5.业务规则接口:IBussness

6.业务规则实现:Bussness

7.数据实体:Entity

8.模型:Model

9.公共工具:Common

10.页面UI:Web

其中我将常规三层的业务逻辑层分为了业务逻辑与业务规则两部分,这样分层的优点是,便于后期维护;缺点是工作量的增加。

二、第三方库的加入

项目搭建完了自然就是加入一些第三方框架。

这里我选择的ORM框架为SqlSugar:

    分别在Common、Entity、IDAL与DAL项目依赖项中右键-管理NuGet程序包-搜索sqlSugarCore-安装(此处为5.0.0.9版本)

    这个项目中我将sqlSugar数据库链接类放入到Common中,以便未来其他项目中可以直接复用Common项目,所以才在Common中引入sqlSugarCore。

    首先在Common中新建BaseDbContext类:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Text;
using Microsoft.Extensions.Configuration;
using SqlSugar; namespace DataManager.Common.Db
{
/// <summary>
/// 数据库操作基类
/// </summary>
public class BaseDbContext
{
public SqlSugarClient Db; /// <summary>
/// 构造函数
/// </summary>
public BaseDbContext(IConfiguration configuration)
{
try
{
//主库
var connMain = ConfigurationManager.AppSettings["ConnMain"];
//从库
var connFrom = ConfigurationManager.AppSettings["ConnFrom"];
InitDataBase(connFrom == null
? new List<string> {connMain.ToString()}
: new List<string> {connMain.ToString(), connFrom.ToString()});
}
catch (Exception ex)
{
throw new Exception("未配置数据库连接字符串");
}
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="listConnSettings">
/// 连接字符串配置Key集合,配置多个连接则是读写分离
/// </param>
public BaseDbContext(List<string> listConnSettings)
{
try
{
var listConn = new List<string>();
foreach (var t in listConnSettings)
{
listConn.Add(ConfigurationManager.ConnectionStrings[t].ToString());
} InitDataBase(listConn);
}
catch
{
throw new Exception("未配置数据库连接字符串");
} } /// <summary>
/// 构造函数
/// </summary>
/// <param name="serverIp">服务器IP</param>
/// <param name="user">用户名</param>
/// <param name="pass">密码</param>
/// <param name="dataBase">数据库</param>
public BaseDbContext(string serverIp, string user, string pass, string dataBase)
{
InitDataBase(new List<string>
{$"server={serverIp};user id={user};password={pass};persistsecurityinfo=True;database={dataBase}"});
} /// <summary>
/// 初始化数据库连接
/// </summary>
/// <param name="listConn">连接字符串</param>
private void InitDataBase(List<string> listConn)
{
var connStr = ""; //主库
var slaveConnectionConfigs = new List<SlaveConnectionConfig>(); //从库集合
for (var i = ; i < listConn.Count; i++)
{
if (i == )
{
connStr = listConn[i]; //主数据库连接
}
else
{
slaveConnectionConfigs.Add(new SlaveConnectionConfig()
{
HitRate = i * ,
ConnectionString = listConn[i]
});
}
} //如果配置了 SlaveConnectionConfigs那就是主从模式,所有的写入删除更新都走主库,查询走从库,
//事务内都走主库,HitRate表示权重 值越大执行的次数越高,如果想停掉哪个连接可以把HitRate设为0
var ctx = new ConfigureExternalServices(); Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = connStr,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
SlaveConnectionConfigs = slaveConnectionConfigs
});
Db.Ado.CommandTimeOut = ; //设置超时时间
Db.Aop.OnLogExecuted = (sql, pars) => //SQL执行完事件
{
};
Db.Aop.OnLogExecuting = (sql, pars) => //SQL执行前事件
{
};
Db.Aop.OnError = (exp) => //执行SQL 错误事件
{
throw new Exception("出错SQL:" + exp.Sql + "\r\n" + exp.Message);
};
Db.Aop.OnExecutingChangeSql = (sql, pars) => //SQL执行前 可以修改SQL
{
return new KeyValuePair<string, SugarParameter[]>(sql, pars);
};
} public SqlSugarClient GetClient() => Db;
}
}

DataManage.Common.Db

    查询排序条件类:

using System;
using System.Collections.Generic;
using System.Text;
using SqlSugar; namespace DataManager.Common
{
/// <summary>
/// 排序类型
/// </summary>
public enum OrderSequence
{
Asc,
Desc
} /// <summary>
/// 排序枚举
/// </summary>
public class OrderByClause
{
public string Sort { get; set; }
public OrderSequence Order { get; set; }
} /// <summary>
/// 查询条件
/// </summary>
public class QueryDescriptor
{
/// <summary>
/// 行数
/// </summary>
public int PageSize { get; set; } /// <summary>
/// 页码
/// </summary>
public int PageIndex { get; set; } /// <summary>
/// 排序
/// </summary>
public List<OrderByClause> OrderBys { get; set; } /// <summary>
/// 条件
/// </summary>
public List<ConditionalModel> Conditions { get; set; }
}
}

DataManager.Common

    在IDAL中新建仓储基类接口IBaseRepository:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq.Expressions;
using DataManager.Common;
using SqlSugar; namespace DataManager.IDAL
{
public interface IBaseRepository<T> : IDisposable where T : class, new()
{
#region 事务
/// <summary>
/// 初始化事务
/// </summary>
/// <param name="level"></param>
void BeginTran(IsolationLevel level = IsolationLevel.ReadCommitted); /// <summary>
/// 完成事务
/// </summary>
void CommitTran(); /// <summary>
/// 完成事务
/// </summary>
void RollbackTran();
#endregion #region 新增
/// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>操作影响的行数</returns>
int Add<T>(T entity, bool isLock = false) where T : class, new(); /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys">泛型集合</param>
/// <param name="isLock">是否加锁</param>
/// <returns>操作影响的行数</returns>
int Add<T>(List<T> entitys, bool isLock = false) where T : class, new(); /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回实体</returns>
T AddReturnEntity<T>(T entity, bool isLock = false) where T : class, new();
/// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回bool, 并将identity赋值到实体</returns>
bool AddReturnBool<T>(T entity, bool isLock = false) where T : class, new(); /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys">泛型集合</param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回bool, 并将identity赋值到实体</returns>
bool AddReturnBool<T>(List<T> entitys, bool isLock = false) where T : class, new();
#endregion #region 修改 /// <summary>
/// 修改数据源
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <returns>数据源</returns>
IUpdateable<T> Updateable<T>() where T : class, new(); /// <summary>
/// 修改(主键是更新条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
int Update<T>(T entity, bool isLock = false) where T : class, new(); /// <summary>
/// 修改
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="update"> 字段集合 </param>
/// <param name="where"> 条件 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
int Update<T>(Expression<Func<T, T>> update, Expression<Func<T, bool>> where, bool isLock = false) where T : class, new(); /// <summary>
/// 修改(主键是更新条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys">泛型集合</param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
int Update<T>(List<T> entitys, bool isLock = false) where T : class, new();
#endregion #region 删除 /// <summary>
/// 删除(主键是条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
int Delete<T>(T entity, bool isLock = false) where T : class, new(); /// <summary>
/// 删除(主键是条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="where"> 条件 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
int Delete<T>(Expression<Func<T, bool>> where, bool isLock = false) where T : class, new();
#endregion #region 查询 /// <summary>
/// 查询数据源
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <returns>数据源</returns>
ISugarQueryable<T> Queryable<T>() where T : class, new(); /// <summary>
/// 查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
T Query<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
List<T> QueryList<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="sql">sql</param>
/// <returns>实体</returns>
List<T> QueryList<T>(string sql) where T : class, new(); /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
DataTable QueryDataTable<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="sql">sql</param>
/// <returns>实体</returns>
DataTable QueryDataTable<T>(string sql) where T : class, new(); /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="query">查询条件</param>
/// <param name="totalCount">总行数</param>
/// <returns>实体</returns>
List<T> QueryPageList<T>(QueryDescriptor query, out int totalCount) where T : class, new(); /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="query">查询条件</param>
/// <param name="totalCount">总行数</param>
/// <returns>实体</returns>
DataTable QueryDataTablePageList<T>(QueryDescriptor query, out int totalCount) where T : class, new(); /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>Json</returns>
string QueryJson<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 查询存储过程
/// </summary>
/// <param name="procedureName">存储过程名称</param>
/// <param name="parameters">参数</param>
DataTable QueryProcedure(string procedureName, List<SugarParameter> parameters); /// <summary>
/// 查询前多少条数据
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <param name="num">数量</param>
/// <returns></returns>
List<T> Take<T>(Expression<Func<T, bool>> whereLambda, int num) where T : class, new(); /// <summary>
/// 查询单条数据
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
T First<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 是否存在
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
bool IsExist<T>(Expression<Func<T, bool>> whereLambda) where T : class, new(); /// <summary>
/// 合计
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
int Sum<T>(string field) where T : class, new(); /// <summary>
/// 最大值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
object Max<T>(string field) where T : class, new(); /// <summary>
/// 最小值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
object Min<T>(string field) where T : class, new(); /// <summary>
/// 平均值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
int Avg<T>(string field) where T : class, new(); #endregion
}
}

DataManager.IDAL

    在DAL中新建仓储基类的实现,在sqlSugar框架中,作者直接将SqlSugarClient默认单例,所以此处不用再做处理可以直接在仓储基类中继承BaseDbContext方便直接操作数据库:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq.Expressions;
using System.Text;
using DataManager.Common;
using DataManager.Common.Db;
using DataManager.IDAL;
using Microsoft.Extensions.Configuration;
using SqlSugar; namespace DataManager.DAL
{
public class BaseService<T> : BaseDbContext, IBaseRepository<T> where T : class, new()
{
public SqlSugarClient DbContext; public BaseService(IConfiguration configuration) : base(configuration)
{
DbContext = GetClient();
} #region 事务 /// <summary>
/// 初始化事务
/// </summary>
/// <param name="level"></param>
public void BeginTran(IsolationLevel level = IsolationLevel.ReadCommitted)
{
DbContext.Ado.BeginTran(IsolationLevel.Unspecified);
} /// <summary>
/// 完成事务
/// </summary>
public void CommitTran()
{
DbContext.Ado.CommitTran();
} /// <summary>
/// 完成事务
/// </summary>
public void RollbackTran()
{
DbContext.Ado.RollbackTran();
} #endregion #region 新增 /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>操作影响的行数</returns>
public int Add<T>(T entity, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Insertable(entity).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Insertable(entity).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
}
} /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys">泛型集合</param>
/// <param name="isLock">是否加锁</param>
/// <returns>操作影响的行数</returns>
public int Add<T>(List<T> entitys, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Insertable(entitys).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Insertable(entitys).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
}
} /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回实体</returns>
public T AddReturnEntity<T>(T entity, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Insertable(entity).With(SqlWith.UpdLock).ExecuteReturnEntity()
: DbContext.Insertable(entity).ExecuteReturnEntity();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回bool, 并将identity赋值到实体</returns>
public bool AddReturnBool<T>(T entity, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Insertable(entity).With(SqlWith.UpdLock).ExecuteCommandIdentityIntoEntity()
: DbContext.Insertable(entity).ExecuteCommandIdentityIntoEntity();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } /// <summary>
/// 新增
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys">泛型集合</param>
/// <param name="isLock">是否加锁</param>
/// <returns>返回bool, 并将identity赋值到实体</returns>
public bool AddReturnBool<T>(List<T> entitys, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Insertable(entitys).With(SqlWith.UpdLock).ExecuteCommandIdentityIntoEntity()
: DbContext.Insertable(entitys).ExecuteCommandIdentityIntoEntity();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } #endregion #region 修改 /// <summary>
/// 修改数据源
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <returns>数据源</returns>
public IUpdateable<T> Updateable<T>() where T : class, new()
{
return DbContext.Updateable<T>();
} /// <summary>
/// 修改(主键是更新条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
public int Update<T>(T entity, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Updateable(entity).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Updateable(entity).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } /// <summary>
/// 修改
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="update"> 实体对象 </param>
/// <param name="where"> 条件 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
public int Update<T>(Expression<Func<T, T>> update, Expression<Func<T, bool>> where, bool isLock = false)
where T : class, new()
{
try
{
var result = isLock
? DbContext.Updateable<T>().SetColumns(update).Where(where).With(SqlWith.UpdLock)
.ExecuteCommand()
: DbContext.Updateable<T>().SetColumns(update).Where(where).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } /// <summary>
/// 修改(主键是更新条件)
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entitys"> 实体对象集合 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
public int Update<T>(List<T> entitys, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Updateable(entitys).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Updateable(entitys).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } #endregion #region 删除 /// <summary>
/// 删除
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="entity"> 实体对象 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
public int Delete<T>(T entity, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Deleteable(entity).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Deleteable(entity).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } /// <summary>
/// 删除
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="where"> 条件 </param>
/// <param name="isLock"> 是否加锁 </param>
/// <returns>操作影响的行数</returns>
public int Delete<T>(Expression<Func<T, bool>> where, bool isLock = false) where T : class, new()
{
try
{
var result = isLock
? DbContext.Deleteable<T>().Where(where).With(SqlWith.UpdLock).ExecuteCommand()
: DbContext.Deleteable<T>().Where(where).ExecuteCommand();
return result;
}
catch (Exception ex)
{
RollbackTran();
throw new Exception(ex.Message);
} } #endregion #region 查询 /// <summary>
/// 查询数据源
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <returns>数据源</returns>
public ISugarQueryable<T> Queryable<T>() where T : class, new()
{
return DbContext.Queryable<T>();
} /// <summary>
/// 查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
public T Query<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
return DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).First();
var str = DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).ToSql();
Console.WriteLine(str);
return null;
} /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
public List<T> QueryList<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
return DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).ToList();
} /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="sql">sql</param>
/// <returns>实体</returns>
public List<T> QueryList<T>(string sql) where T : class, new()
{
return DbContext.SqlQueryable<T>(sql).With(SqlWith.NoLock).ToList();
} /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
public DataTable QueryDataTable<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
return DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).ToDataTable();
} /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="sql">sql</param>
/// <returns>实体</returns>
public DataTable QueryDataTable<T>(string sql) where T : class, new()
{
return DbContext.SqlQueryable<T>(sql).With(SqlWith.NoLock).ToDataTable();
} /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="query">查询条件</param>
/// <param name="totalCount">总行数</param>
/// <returns>实体</returns>
public List<T> QueryPageList<T>(QueryDescriptor query, out int totalCount) where T : class, new()
{
if (query == null)
{
throw new ArgumentNullException(nameof(query));
} var listDatas = DbContext.Queryable<T>();
if (query.Conditions != null)
{
var conds = ParseCondition(query.Conditions);
listDatas = listDatas.Where(conds);
} if (query.OrderBys != null)
{
var orderBys = ParseOrderBy(query.OrderBys);
listDatas = listDatas.OrderBy(orderBys);
} totalCount = ;
var datas = listDatas.ToPageList(query.PageIndex, query.PageSize, ref totalCount);
return datas;
} /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="query">查询条件</param>
/// <param name="totalCount">总行数</param>
/// <returns>DataTable</returns>
public DataTable QueryDataTablePageList<T>(QueryDescriptor query, out int totalCount) where T : class, new()
{
if (query == null)
{
throw new ArgumentNullException(nameof(query));
} var listDatas = DbContext.Queryable<T>();
if (query.Conditions != null)
{
var conds = ParseCondition(query.Conditions);
listDatas = listDatas.Where(conds);
} if (query.OrderBys != null)
{
var orderBys = ParseOrderBy(query.OrderBys);
listDatas = listDatas.OrderBy(orderBys);
} totalCount = ;
var datas = listDatas.ToDataTablePage(query.PageIndex, query.PageSize, ref totalCount);
return datas;
} /// <summary>
/// 查询集合
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型)</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns>Json</returns>
public string QueryJson<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
return DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).ToJson();
} /// <summary>
/// 查询存储过程
/// </summary>
/// <param name="procedureName">存储过程名称</param>
/// <param name="parameters">参数</param>re
public DataTable QueryProcedure(string procedureName, List<SugarParameter> parameters)
{
var datas = DbContext.Ado.UseStoredProcedure().GetDataTable(procedureName, parameters);
return datas;
} /// <summary>
/// 查询前多少条数据
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <param name="num">数量</param>
/// <returns></returns>
public List<T> Take<T>(Expression<Func<T, bool>> whereLambda, int num) where T : class, new()
{
var datas = DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).Take(num).ToList();
return datas;
} /// <summary>
/// 查询单条数据
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
public T First<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
var datas = DbContext.Queryable<T>().With(SqlWith.NoLock).Where(whereLambda).First();
return datas;
} /// <summary>
/// 是否存在
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="whereLambda">查询表达式</param>
/// <returns></returns>
public bool IsExist<T>(Expression<Func<T, bool>> whereLambda) where T : class, new()
{
var datas = DbContext.Queryable<T>().Any(whereLambda);
return datas;
} /// <summary>
/// 合计
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
public int Sum<T>(string field) where T : class, new()
{
var datas = DbContext.Queryable<T>().Sum<int>(field);
return datas;
} /// <summary>
/// 最大值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
public object Max<T>(string field) where T : class, new()
{
var datas = DbContext.Queryable<T>().Max<object>(field);
return datas;
} /// <summary>
/// 最小值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
public object Min<T>(string field) where T : class, new()
{
var datas = DbContext.Queryable<T>().Min<object>(field);
return datas;
} /// <summary>
/// 平均值
/// </summary>
/// <typeparam name="T">泛型参数(集合成员的类型</typeparam>
/// <param name="field">字段</param>
/// <returns></returns>
public int Avg<T>(string field) where T : class, new()
{
var datas = DbContext.Queryable<T>().Avg<int>(field);
return datas;
} #endregion #region 私有方法 /// <summary>
/// 查询条件转换
/// </summary>
/// <param name="contitons">查询条件</param>
/// <returns></returns>
private List<IConditionalModel> ParseCondition(List<ConditionalModel> contitons)
{
var conds = new List<IConditionalModel>();
foreach (var con in contitons)
{
if (con.FieldName.Contains(","))
{
conds.Add(ParseKeyOr(con));
}
else
{
conds.Add(new ConditionalModel()
{
FieldName = con.FieldName,
ConditionalType = con.ConditionalType,
FieldValue = con.FieldValue
});
}
} return conds;
} /// <summary>
/// 转换Or条件
/// </summary>
/// <param name="condition"></param>
/// <returns></returns>
private ConditionalCollections ParseKeyOr(ConditionalModel condition)
{
var objectKeys = condition.FieldName.Split(',');
var conditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>();
foreach (var objKey in objectKeys)
{
var cond = new KeyValuePair<WhereType, ConditionalModel>
(WhereType.Or, new ConditionalModel()
{
FieldName = objKey,
ConditionalType = condition.ConditionalType,
FieldValue = condition.FieldValue
});
conditionalList.Add(cond);
} return new ConditionalCollections { ConditionalList = conditionalList };
} /// <summary>
/// 排序转换
/// </summary>
/// <param name="orderBys">排序</param>
/// <returns></returns>
private string ParseOrderBy(List<OrderByClause> orderBys)
{
var conds = "";
foreach (var con in orderBys)
{
if (con.Order == OrderSequence.Asc)
{
conds += $"{con.Sort} asc,";
}
else if (con.Order == OrderSequence.Desc)
{
conds += $"{con.Sort} desc,";
}
} return conds.TrimEnd(',');
} #endregion /// <summary>
/// 处理
/// </summary>
public void Dispose()
{
RollbackTran();
DbContext.Close(); }
}
}

DataManager.DAL

    至此sqlSugar前期工作完成,后期新增的实体新建对应的仓库,直接继承BaseRepository。下一篇我会将Swagger加入到项目中。

    

asp.net core 一个中小型项目实战的起手式——项目搭建与仓储模式下的持久层创建(1)的更多相关文章

  1. asp.net core 一个中小型项目实战的起手式——Swagger配置

    交流群:863563315 一.Swagger是什么 Swagger 是一款RESTFUL接口的.基于YAML.JSON语言的文档在线自动生成.代码自动生成的工具. 二.如何在项目中加入Swagger ...

  2. 【asp.net core 系列】10 实战之ActionFilter

    0.前言 在上一篇中,我们提到了如何创建一个UnitOfWork并通过ActionFilter设置启用.这一篇我们将简单介绍一下ActionFilter以及如何利用ActionFilter,顺便补齐一 ...

  3. ASP.NET Core会议管理平台实战_汇总贴

    ASP.NET Core会议管理平台实战 课程地址:https://ke.qq.com/course/389673?from=800004097#term_id=100464670 ASP.NET C ...

  4. 【asp.net core 系列】6 实战之 一个项目的完整结构

    0. 前言 在<asp.net core 系列>之前的几篇文章中,我们简单了解了路由.控制器以及视图的关系以及静态资源的引入,让我们对于asp.net core mvc项目有了基本的认识. ...

  5. 【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是 ...

  6. ASP.NET Core 快速入门(实战篇)

    上篇讲了<asp.net core在linux上的环境部署>.今天我们将做几个小玩意实战一下.用到的技术和工具有mysql.websocket.AngleSharp(爬虫html解析).n ...

  7. 52abp框架asp.net core & Angular快速开发实战视频教程

    课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...

  8. 【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现

    0. 前言 通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口.这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方. 1. 添加EF Core 先 ...

  9. 使用angular4和asp.net core 2 web api做个练习项目(一)

    这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是windows 10 安装工具: git for ...

随机推荐

  1. HDU 6053:TrickGCD(莫比乌斯反演)

    题目链接 题意 给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质. 思路 想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后 ...

  2. django基础知识之模型查询:

    查询集表示从数据库中获取的对象集合 查询集可以含有零个.一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主 ...

  3. shiro自定义异常无法被捕获总是抛出AuthenticationException解决方案

    这个问题我也是出的莫名其妙,刚开始好好的,然后配置多realm之后出的. 现在直入主题 在继承了 org.apache.shiro.authc.pam.ModularRealmAuthenticato ...

  4. Django rest framework(4)----版本

    目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django res ...

  5. 主机地址变更后,dubbo请求时依旧会寻址旧IP的问题

    机房迁移,导致测试服务器IP变更,比原于IP为192.168.1.105变更为10.1.9.120. 服务源码未做任何变更,启动服务时依旧是旧地址请求,此问题由dubbo本地注册中心的缓存所致,清理掉 ...

  6. Centos7:yum安装MySQL5.7后如何设置root密码

    Centos下安装软件的方式很简单,只需要通过yum install xxx命令即可.第一步当然检查是否有mysql的yum源,命令:yum list|grep mysql-community[主要还 ...

  7. Hash的应用2

    代码: #include <stdio.h> #define OFFSET 500000//偏移量 ];//记录每个数是否出现,出现为1,不出现为0 int main(){ int n,m ...

  8. Lake Counting-C++

    Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...

  9. 【并查集】连接格点-C++

    连接格点 描述 有一个M行N列的点阵,相邻两点可以相连.一条纵向的连线花费一个单位,一条横向的连线花费两个单位.某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通. 输入 第一 ...

  10. excel报表开发-- 根据datatable个数自动生成新sheet

    总结一下很久之前做的报表小程序,今日有问题又调试了一下. DB中存在一个表,记录了ID<自增长>,SqlStatement<sql查询语句>及其他必要字段,比如SheetNam ...