.NetCore中使用SqlSugar

1.环境

项目版本号
.Net Corenetcoreapp3.1
sqlSugarCore5.0.0.15

2.依赖注入SqlSugar

    /// <summary>
    /// SqlSugar 依赖注入
    /// </summary>
    public static class SqlSugarInit
    {

        public static void AddSqlsugarSetup(this IServiceCollection services, string conn)
        {
            if (services == null) throw new ArgumentNullException(nameof(services));



            string sqlConn = conn;
            services.AddScoped<ISqlSugarClient>(o =>
            {
                var client = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = sqlConn,//必填, 数据库连接字符串
                    DbType = (DbType)DbType.SqlServer,//必填, 数据库类型
                    IsAutoCloseConnection = false,//默认false, 是否自动关闭数据库连接, 设置为true无需使用using或者Close操作
                    InitKeyType = InitKeyType.Attribute //默认SystemTable, 字段信息读取, 如:该属性是不是主键,标识列等等信息
                });
                //用来打印Sql方便你调式    
                client.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql + "\r\n" +
                    client.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
                    Console.WriteLine();
                };

                return client;
            });
        }
    }

在Startup类中进行注入:

 public void ConfigureServices(IServiceCollection services)
        {
            #region SqlSugarCore
            //依赖注入SqlSugar            
            services.AddSqlsugarSetup(Configuration.GetSection("ConnectionStrings").GetSection("MSSQLConnection").Value);
            #endregion
            services.AddControllers();
        }

3.基类中使用

接口:

    /// <summary>
    /// 仓储层接口基类
    /// 提供最公共的增删改查功能
    /// </summary>
    public interface IBaseRepository<TEntity> where TEntity : class
    {

        /// <summary>
        /// 根据主键Id获取实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<TEntity> QueryById(object objId);



        /// <summary>
        /// 功能描述:根据ID查询一条数据
        /// </summary>
        /// <param name="objId">id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <param name="blnUseCache">是否使用缓存</param>
        /// <returns>数据实体</returns>
        Task<TEntity> QueryById(object objId, bool blnUseCache = false);




        /// <summary>
        /// 功能描述:根据Id's查询多条数据
        /// </summary>
        /// <param name="lstIds">id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <returns>数据实体列表</returns>
        Task<List<TEntity>> QueryByIDs(object[] lstIds);


        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        Task<int> Add(TEntity entity);



        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <param name="insertColumns">指定只插入列</param>
        /// <returns>返回自增量列</returns>
        Task<int> Add(TEntity entity, Expression<Func<TEntity, object>> insertColumns = null);


        /// <summary>
        /// 批量插入实体(速度快)
        /// </summary>
        /// <param name="listEntity">实体集合</param>
        /// <returns>影响行数</returns>
        Task<int> AddMany(List<TEntity> listEntity);


        /// <summary>
        /// 更新实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        Task<bool> Update(TEntity entity);


        //批量更新
        Task<int> UpdateMany(List<TEntity> listEntity);
        /// <summary>
        /// 根据实体删除一条数据
        /// </summary>
        /// <param name="entity">博文实体类</param>
        /// <returns></returns>
        Task<bool> Delete(TEntity entity);



        /// <summary>
        /// 删除指定ID的数据
        /// </summary>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        Task<bool> DeleteById(object id);


        /// <summary>
        /// 删除指定ID集合的数据(批量删除)
        /// </summary>
        /// <param name="ids">主键ID集合</param>
        /// <returns></returns>
        Task<bool> DeleteByIds(object[] ids);

        Task<bool> DeleteByNotKeyIds(Expression<Func<TEntity, bool>> expression);
        /// <summary>
        /// 功能描述:查询所有数据
        /// </summary>
        /// <returns>数据列表</returns>
        Task<List<TEntity>> QueryAll();



        /// <summary>
        /// 功能描述:查询数据列表
        /// </summary>
        /// <param name="whereExpression">whereExpression</param>
        /// <returns>数据列表</returns>
        Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression);



        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds);


        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="orderByExpression">排序表达式</param>
        /// <param name="isAsc">排序规则</param>
        /// <returns></returns>
        Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true);


        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="strWhere">条件</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        Task<List<TEntity>> Query(string strWhere, string strOrderByFileds);


        /// <summary>
        /// 功能描述:查询前N条数据
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="intTop">前N条</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        Task<List<TEntity>> QueryTopN(
            Expression<Func<TEntity, bool>> whereExpression,
            int intTop,
            string strOrderByFileds);



        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="intPageIndex">页码(下标0)</param>
        /// <param name="intPageSize">页大小</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns></returns>
        Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> whereExpression=null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null);



        /// <summary>
        /// 映射查询
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="whereExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="intPageIndex"></param>
        /// <param name="intPageSize"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
         Task<PageModel<TResult>> QueryPageWithSelect<TResult>(Expression<Func<TEntity, bool>> whereExpression = null, Expression<Func<TEntity, TResult>> selectExpression = null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null);

        /// <summary> 
        ///查询-多表查询
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="T3">实体3</typeparam>
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码(下标0)</param>
        /// <param name="intPageSize">页大小</param>
        /// <returns>值</returns>
        Task<PageModel<TResult>> QueryMuch<T, T2, T3, TResult>(
              Expression<Func<T, T2, T3, object[]>> joinExpression,
              Expression<Func<T, T2, T3, TResult>> selectExpression,
              Expression<Func<T, T2, T3, bool>> whereLambda = null,
               string strOrderByFileds = null,
              int intPageIndex = 1, int intPageSize = 20) where T : class, new();



        /// <summary> 
        ///查询-多表查询
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        Task<PageModel<TResult>> QueryMuch<T, T2, TResult>(
           Expression<Func<T, T2, object[]>> joinExpression,
           Expression<Func<T, T2, TResult>> selectExpression,
           Expression<Func<T, T2, bool>> whereLambda = null,
           string strOrderByFileds = null,
           int intPageIndex = 1, int intPageSize = 20) where T : class, new();


        /// <summary>
        /// 四表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="T4"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <param name="intPageIndex"></param>
        /// <param name="intPageSize"></param>
        /// <returns></returns>
        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4,  TResult>(
            Expression<Func<T, T2, T3, T4, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4,  TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4,  bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new();


        /// <summary>
        /// 五表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="T4"></typeparam>
        /// <typeparam name="T5"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <param name="intPageIndex"></param>
        /// <param name="intPageSize"></param>
        /// <returns></returns>
        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, TResult>(
            Expression<Func<T, T2, T3, T4, T5, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4, T5,  TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4, T5,  bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new();

        /// <summary>
        /// 六表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="T4"></typeparam>
        /// <typeparam name="T5"></typeparam>
        /// <typeparam name="T6"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <param name="intPageIndex"></param>
        /// <param name="intPageSize"></param>
        /// <returns></returns>
        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, TResult>(
            Expression<Func<T, T2, T3, T4, T5, T6, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4, T5, T6, TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4, T5, T6, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new();



        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6,T7, TResult>(
       Expression<Func<T, T2, T3, T4, T5, T6, T7, object[]>> joinExpression,
       Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> selectExpression,
       Expression<Func<T, T2, T3, T4, T5, T6, T7, bool>> whereLambda = null,
       string strOrderByFileds = null,
       int intPageIndex = 1, int intPageSize = 10) where T : class, new();

        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, T7,T8, TResult>(
    Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, object[]>> joinExpression,
    Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, TResult>> selectExpression,
    Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, bool>> whereLambda = null,
    string strOrderByFileds = null,
    int intPageIndex = 1, int intPageSize = 10) where T : class, new();

        Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, T7, T8,T9, TResult>(
  Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, object[]>> joinExpression,
  Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> selectExpression,
  Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, bool>> whereLambda = null,
  string strOrderByFileds = null,
  int intPageIndex = 1, int intPageSize = 10) where T : class, new();

        /// <summary>
        /// 原生sql查询
        /// </summary>
        /// <param name="sql">sql</param>
        /// <param name="parameters">参数集合</param>
        /// <returns></returns>
        Task<List<TEntity>> QuerySql(string strSql, SugarParameter[] parameters = null);

        /// <summary>
        /// 事务操作
        /// </summary>
        /// <typeparam name="T1">传入参数</typeparam>
        /// <typeparam name="T2">返回值</typeparam>
        /// <param name="fun">执行的方法</param>
        /// <returns></returns>
        T2 Tran<T2>(Func<T2> fun); //where T2 : class;





        /// <summary>
        /// 分组查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="groupbyExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        Task<List<TResult>> QueryMuchGroupBy<T, T2, TResult>(
        Expression<Func<T, T2, object[]>> joinExpression,
        Expression<Func<T, T2, TResult>> selectExpression,
         Expression<Func<T, T2, object>> groupbyExpression,
        Expression<Func<T, T2, bool>> whereLambda = null,
        string strOrderByFileds = null) where T : class, new();



        /// <summary>
        /// 分组查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="groupbyExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        Task<List<TResult>> QueryMuchGroupBy<T, T2, T3, TResult>(
         Expression<Func<T, T2, T3, object[]>> joinExpression,
         Expression<Func<T, T2, T3, TResult>> selectExpression,
          Expression<Func<T, T2, T3, object>> groupbyExpression,
         Expression<Func<T, T2, T3, bool>> whereLambda = null,
         string strOrderByFileds = null) where T : class, new();

        /// <summary>
        /// 分组查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="T4"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="groupbyExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        Task<List<TResult>> QueryMuchGroupBy<T, T2, T3,T4, TResult>(
         Expression<Func<T, T2, T3, T4, object[]>> joinExpression,
         Expression<Func<T, T2, T3, T4, TResult>> selectExpression,
          Expression<Func<T, T2, T3, T4, object>> groupbyExpression,
         Expression<Func<T, T2, T3, T4, bool>> whereLambda = null,
         string strOrderByFileds = null) where T : class, new();

    }

实现:

    /// <summary>
    /// 仓储层基类
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public class BaseRepository<TEntity> : IBaseRepository<TEntity>
      where TEntity : class, new()
    {

        protected readonly ISqlSugarClient _sqlSugarClient;
        public BaseRepository(ISqlSugarClient sqlSugarClient)
        {
            _sqlSugarClient = sqlSugarClient;
        }

        /// <summary>
        /// 根据主键Id获取实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<TEntity> QueryById(object objId)
        {

            //_dbContext.Set<TEntity>.
            return await _sqlSugarClient.Queryable<TEntity>().In(objId).SingleAsync();
        }



   


        /// <summary>
        /// 功能描述:根据ID查询一条数据
        /// </summary>
        /// <param name="objId">id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <param name="blnUseCache">是否使用缓存</param>
        /// <returns>数据实体</returns>
        public async Task<TEntity> QueryById(object objId, bool blnUseCache = false)
        {
            //return await Task.Run(() => _db.Queryable<TEntity>().WithCacheIF(blnUseCache).InSingle(objId));
            return await _sqlSugarClient.Queryable<TEntity>().WithCacheIF(blnUseCache).In(objId).SingleAsync();
        }


        /// <summary>
        /// 功能描述:根据Id's查询多条数据
        /// </summary>
        /// <param name="lstIds">id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <returns>数据实体列表</returns>
        public async Task<List<TEntity>> QueryByIDs(object[] lstIds)
        {
            //return await Task.Run(() => _db.Queryable<TEntity>().In(lstIds).ToList());
            return await _sqlSugarClient.Queryable<TEntity>().In(lstIds).ToListAsync();
        }

        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public async Task<int> Add(TEntity entity)
        {


            var i = await Task.Run(() => _sqlSugarClient.Insertable(entity).ExecuteCommandAsync());
            //返回的i是long类型,这里你可以根据你的业务需要进行处理
            return (int)i;
            //var insert = _sqlSugarClient.Insertable(entity).ExecuteReturnIdentityAsync();
            //return await insert;
        }


        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <param name="insertColumns">指定只插入列</param>
        /// <returns>返回自增量列</returns>
        public async Task<int> Add(TEntity entity, Expression<Func<TEntity, object>> insertColumns = null)
        {
            var insert = _sqlSugarClient.Insertable(entity);
            if (insertColumns == null)
            {
                return await insert.ExecuteReturnIdentityAsync();
            }
            else
            {
                return await insert.InsertColumns(insertColumns).ExecuteReturnIdentityAsync();
            }
        }

        /// <summary>
        /// 批量插入实体(速度快)
        /// </summary>
        /// <param name="listEntity">实体集合</param>
        /// <returns>影响行数</returns>
        public async Task<int> AddMany(List<TEntity> listEntity)
        {
            return await _sqlSugarClient.Insertable(listEntity.ToArray()).ExecuteCommandAsync();
        }

        /// <summary>
        /// 更新实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public async Task<bool> Update(TEntity entity)
        {
            这种方式会以主键为条件
            //var i = await Task.Run(() => _db.Updateable(entity).ExecuteCommand());
            //return i > 0;
            //这种方式会以主键为条件
            return await _sqlSugarClient.Updateable(entity).ExecuteCommandHasChangeAsync();
        }

        //批量更新
        public async Task<int> UpdateMany(List<TEntity> listEntity)
        {
            var i = await _sqlSugarClient.Updateable(listEntity).ExecuteCommandAsync();
            return i;
        }

        /// <summary>
        /// 根据实体删除一条数据
        /// </summary>
        /// <param name="entity">博文实体类</param>
        /// <returns></returns>
        public async Task<bool> Delete(TEntity entity)
        {

            return await _sqlSugarClient.Deleteable(entity).ExecuteCommandHasChangeAsync();
        }


        /// <summary>
        /// 删除指定ID的数据
        /// </summary>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        public async Task<bool> DeleteById(object id)
        {

            return await _sqlSugarClient.Deleteable<TEntity>(id).ExecuteCommandHasChangeAsync();
        }

        /// <summary>
        /// 删除指定ID集合的数据(批量删除)
        /// </summary>
        /// <param name="ids">主键ID集合</param>
        /// <returns></returns>
        public async Task<bool> DeleteByIds(object[] ids)
        {

            return await _sqlSugarClient.Deleteable<TEntity>().In(ids).ExecuteCommandHasChangeAsync();
        }


        public async Task<bool> DeleteByNotKeyIds(Expression<Func<TEntity, bool>> expression)
        {
            return await _sqlSugarClient.Deleteable<TEntity>().Where(expression).ExecuteCommandHasChangeAsync();
        }

        /// <summary>
        /// 功能描述:查询所有数据
        /// </summary>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> QueryAll()
        {
            return await _sqlSugarClient.Queryable<TEntity>().ToListAsync();
        }


        /// <summary>
        /// 功能描述:查询数据列表
        /// </summary>
        /// <param name="whereExpression">whereExpression</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression)
        {
            return await _sqlSugarClient.Queryable<TEntity>().WhereIF(whereExpression != null, whereExpression).ToListAsync();
        }


        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression, string strOrderByFileds)
        {
            return await _sqlSugarClient.Queryable<TEntity>().WhereIF(whereExpression != null, whereExpression).OrderByIF(strOrderByFileds != null, strOrderByFileds).ToListAsync();
        }

        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="orderByExpression">排序表达式</param>
        /// <param name="isAsc">排序规则</param>
        /// <returns></returns>
        public async Task<List<TEntity>> Query(Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, object>> orderByExpression, bool isAsc = true)
        {

            return await _sqlSugarClient.Queryable<TEntity>().OrderByIF(orderByExpression != null, orderByExpression, isAsc ? OrderByType.Asc : OrderByType.Desc).WhereIF(whereExpression != null, whereExpression).ToListAsync();
        }

        /// <summary>
        /// 功能描述:查询一个列表
        /// </summary>
        /// <param name="strWhere">条件</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(string strWhere, string strOrderByFileds)
        {
            return await _sqlSugarClient.Queryable<TEntity>().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToListAsync();
        }

        /// <summary>
        /// 功能描述:查询前N条数据
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="intTop">前N条</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> QueryTopN(
            Expression<Func<TEntity, bool>> whereExpression,
            int intTop,
            string strOrderByFileds)
        {
            return await _sqlSugarClient.Queryable<TEntity>().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).Take(intTop).ToListAsync();
        }


        /// <summary>
        /// 分页查询
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="intPageIndex">页码(下标0)</param>
        /// <param name="intPageSize">页大小</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns></returns>
        public async Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> whereExpression=null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null)
        {

            RefAsync<int> totalCount = 0;
            var list = await _sqlSugarClient.Queryable<TEntity>()
             .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds)
             .WhereIF(whereExpression != null, whereExpression)
             .ToPageListAsync(intPageIndex, intPageSize, totalCount);

            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TEntity>() { DataCount = totalCount, PageCount = pageCount,  PageSize = intPageSize, Data = list };
        }


        /// <summary>
        /// 映射查询
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="whereExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="intPageIndex"></param>
        /// <param name="intPageSize"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        public async Task<PageModel<TResult>> QueryPageWithSelect<TResult>(Expression<Func<TEntity, bool>> whereExpression = null, Expression<Func<TEntity, TResult>> selectExpression=null, int intPageIndex = 1, int intPageSize = 20, string strOrderByFileds = null)
        {

            RefAsync<int> totalCount = 0;
            var list = await _sqlSugarClient.Queryable<TEntity>()
             .OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds)
             .WhereIF(whereExpression != null, whereExpression)
             .Select(selectExpression)
             .ToPageListAsync(intPageIndex, intPageSize, totalCount);

            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };
        }





        /// <summary> 
        ///查询-多表查询(2表)
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        public async Task<PageModel<TResult>> QueryMuch<T, T2, TResult>(
            Expression<Func<T, T2, object[]>> joinExpression,
            Expression<Func<T, T2, TResult>> selectExpression,
            Expression<Func<T, T2, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list=  await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };
        }

        /// <summary> 
        ///查询-多表查询(3表)
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="T3">实体3</typeparam>
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, TResult>(
            Expression<Func<T, T2, T3, object[]>> joinExpression,
            Expression<Func<T, T2, T3, TResult>> selectExpression,
            Expression<Func<T, T2, T3, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };

        }

        /// <summary> 
        ///查询-多表查询(4表)
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="T3">实体3</typeparam>
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3,T4, TResult>(
            Expression<Func<T, T2, T3, T4, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4, TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };

        }


        /// <summary> 
        ///查询-多表查询(5表)
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="T3">实体3</typeparam>
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, TResult>(
            Expression<Func<T, T2, T3, T4, T5, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4, T5, TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4, T5, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };

        }

        /// <summary> 
        ///查询-多表查询(6表)
        /// </summary> 
        /// <typeparam name="T">实体1</typeparam> 
        /// <typeparam name="T2">实体2</typeparam> 
        /// <typeparam name="T3">实体3</typeparam>
        /// <typeparam name="TResult">返回对象</typeparam>
        /// <param name="joinExpression">关联表达式 (join1,join2) => new object[] {JoinType.Left,join1.UserNo==join2.UserNo}</param> 
        /// <param name="selectExpression">返回表达式 (s1, s2) => new { Id =s1.UserNo, Id1 = s2.UserNo}</param>
        /// <param name="whereLambda">查询表达式 (w1, w2) =>w1.UserNo == "")</param> 
        /// <param name="intPageIndex">页码索引</param>
        ///  <param name="intPageIndex">每页条数</param>
        /// <returns>值</returns>
        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, TResult>(
            Expression<Func<T, T2, T3, T4, T5, T6, object[]>> joinExpression,
            Expression<Func<T, T2, T3, T4, T5, T6, TResult>> selectExpression,
            Expression<Func<T, T2, T3, T4, T5, T6, bool>> whereLambda = null,
            string strOrderByFileds = null,
            int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };

        }



        /// <summary>
        /// 根据sql语句查询
        /// </summary>
        /// <param name="strSql">完整的sql语句</param>
        /// <param name="parameters">参数</param>
        /// <returns>泛型集合</returns>
        public async Task<List<TEntity>> QuerySql(string strSql, SugarParameter[] parameters = null)
        {
            return await _sqlSugarClient.Ado.SqlQueryAsync<TEntity>(strSql, parameters);
        }

        /// <summary>
        /// 事务操作
        /// </summary>
        /// <typeparam name="T1">传入参数</typeparam>
        /// <typeparam name="T2">返回值</typeparam>
        /// <param name="fun">执行的方法</param>
        /// <returns></returns>
        public T2 Tran<T2>(Func<T2> fun) //where T2 : class
        {
            T2 t2 = default;
            try
            {
                _sqlSugarClient.Ado.BeginTran();
                //操作
                t2 = fun.Invoke();
                _sqlSugarClient.Ado.CommitTran();
                return t2;
            }
            catch (Exception ex)
            {
                _sqlSugarClient.Ado.RollbackTran();
                throw ex;
            }
        }

        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, T7, TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, object[]>> joinExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, TResult>> selectExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, bool>> whereLambda = null, string strOrderByFileds = null, int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };
        }


        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, T7,T8, TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, object[]>> joinExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, TResult>> selectExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, bool>> whereLambda = null, string strOrderByFileds = null, int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };
        }


        public async Task<PageModel<TResult>> QueryMuch<T, T2, T3, T4, T5, T6, T7, T8,T9, TResult>(Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, object[]>> joinExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> selectExpression, Expression<Func<T, T2, T3, T4, T5, T6, T7, T8, T9, bool>> whereLambda = null, string strOrderByFileds = null, int intPageIndex = 1, int intPageSize = 10) where T : class, new()
        {
            RefAsync<int> totalCount = 0;
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);

            //list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToPageListAsync(intPageIndex, intPageSize, totalCount);


            int pageCount = (Math.Ceiling(totalCount.ObjToDecimal() / intPageSize.ObjToDecimal())).ObjToInt();
            return new PageModel<TResult>() { DataCount = totalCount, PageCount = pageCount, PageSize = intPageSize, Data = list };
        }


        /// <summary>
        /// 分组查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="groupbyExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        public async Task<List<TResult>> QueryMuchGroupBy<T, T2,  TResult>(
         Expression<Func<T, T2,  object[]>> joinExpression,
         Expression<Func<T, T2,  TResult>> selectExpression,
          Expression<Func<T, T2,  object>> groupbyExpression,
         Expression<Func<T, T2,  bool>> whereLambda = null,
         string strOrderByFileds = null) where T : class, new()
        {
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression).GroupBy(groupbyExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToListAsync();
            return list;
        }


        /// <summary>
        /// 分组查询
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="T2"></typeparam>
        /// <typeparam name="T3"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="joinExpression"></param>
        /// <param name="selectExpression"></param>
        /// <param name="groupbyExpression"></param>
        /// <param name="whereLambda"></param>
        /// <param name="strOrderByFileds"></param>
        /// <returns></returns>
        public async Task<List<TResult>> QueryMuchGroupBy<T, T2, T3, TResult>(
         Expression<Func<T, T2, T3, object[]>> joinExpression,
         Expression<Func<T, T2, T3, TResult>> selectExpression,
          Expression<Func<T, T2, T3, object>> groupbyExpression,
         Expression<Func<T, T2, T3, bool>> whereLambda = null,
         string strOrderByFileds = null) where T : class, new()
        {
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression).GroupBy(groupbyExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToListAsync();
            return list;
        }

        public async Task<List<TResult>> QueryMuchGroupBy<T, T2, T3, T4, TResult>(Expression<Func<T, T2, T3, T4, object[]>> joinExpression, Expression<Func<T, T2, T3, T4, TResult>> selectExpression, Expression<Func<T, T2, T3, T4, object>> groupbyExpression, Expression<Func<T, T2, T3, T4, bool>> whereLambda = null, string strOrderByFileds = null) where T : class, new()
        {
            List<TResult> list;
            var query = _sqlSugarClient.Queryable(joinExpression).GroupBy(groupbyExpression);
            if (whereLambda != null)
            {
                query = query.Where(whereLambda);
            }

            list = await query.OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).Select(selectExpression).ToListAsync();
            return list;
        }
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐