1、引入nuget包

install-package sqlSugar

2、仓储类

public class BaseRepository<TEntity> : SimpleClient<TEntity> where TEntity : class, new()
    {
        private Logger loggers = Logger.CreateLogger(typeof(BaseRepository<TEntity>));
        public BaseRepository(ISqlSugarClient context = null) : base(context)
        {
            if (context == null)
            {
                // 分库处理
                Config config = Config.getBean();
                if (typeof(TEntity).GetTypeInfo().GetCustomAttributes(typeof(SugarTable), true).FirstOrDefault((x => x.GetType() == typeof(SugarTable))) is SugarTable sugarTable)
                {
                    string conncent = sugarTable.TableDescription;
                    if (string.IsNullOrWhiteSpace(conncent))  { config = Config.getBean();}
                    else{ config = Config.getBean(conncent.ToUpper());}
                }

                base.Context = new SqlSugarClient(new ConnectionConfig()
                {
                    DbType = (DbType)config.DbType,
                    InitKeyType = (InitKeyType)config.InitKeyType,
                    IsAutoCloseConnection = config.IsAutoCloseConnection,
                    ConnectionString = config.ConnectionString,
                    ConfigureExternalServices = new ConfigureExternalServices()
                    {
                        DataInfoCacheService = new HttpRuntimeCache()
                    }
                });
                base.Context.Aop.OnLogExecuting = (sql, pars) => //SQL执行中事件
                { //loggers.Warn(new LogContent("OnLogExecuting", "SQL语句打印", "SQL:" + GetParas(pars) + "【SQL语句】:" + sql));
                };
                base.Context.Aop.OnError = (e) =>{
                    loggers.Error(new LogContent("BaseRepository", "SQL异常事件", e.Message));
                };
            }
        }



        private string GetParas(SugarParameter[] pars)
        {
            string key = "【SQL参数】:";
            foreach (var param in pars)
            {
                key += $"{param.ParameterName}:{param.Value}\n";
            }

            return key;
        }
        
        internal ISqlSugarClient Db
        {
            get { return Context; }
        }
        
        public void BeginTran()
        {
            Context.Ado.BeginTran();
        }

        public void Commit()
        {
            Context.Ado.CommitTran();
        }

        public void Rollback()
        {
            Context.Ado.RollbackTran();
        }
        /// <summary>
        /// 功能描述:根据ID查新数据
        /// </summary>
        /// <param name="objId">id(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <returns></returns>
        public async Task<TEntity> QueryById(object objId)
        {
            return await Context.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 Context.Queryable<TEntity>().WithCacheIF(blnUseCache).In(objId).SingleAsync();
        }
        /// <summary>
        /// 功能描述:根据ID查询数据
        /// </summary>
        /// <param name="lstIds">id列表(必须指定主键特性 [SugarColumn(IsPrimaryKey=true)]),如果是联合主键,请使用Where条件</param>
        /// <returns>数据实体列表</returns>
        public async Task<List<TEntity>> QueryByIDs(object[] lstIds)
        {
            return await Context.Queryable<TEntity>().In(lstIds).ToListAsync();
        }

        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public async Task<long> Add(TEntity entity)
        {
            var insert = Context.Insertable(entity);
            return await insert.ExecuteReturnBigIdentityAsync();
        }

        /// <summary>
        /// 写入实体数据(同步方法)
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public long AddSync(TEntity entity)
        {
            var insert = Context.Insertable(entity);
            return insert.ExecuteReturnBigIdentity();
        }


        /// <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 = Context.Insertable(entity);
            if (insertColumns == null)
            {
                return await insert.ExecuteReturnIdentityAsync();
            }
            else
            {
                return await insert.InsertColumns(insertColumns).ExecuteReturnIdentityAsync();
            }
        }

        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns>返回被影响的行数</returns>
        public async Task<int> AddByRows(TEntity entity)
        {
            var insert = Context.Insertable(entity);
            return await insert.ExecuteCommandAsync();
        }
        /// <summary>
        /// 写入实体数据
        /// </summary>
        /// <param name="listEntity">实体类集合</param>
        /// <returns>返回被影响的行数</returns>
        public int AddByRows(List<TEntity> listEntity)
        {
            return Context.Insertable(listEntity.ToArray()).ExecuteCommand();
        }

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

        public int AddSync(List<TEntity> listEntity)
        {
            return Context.Insertable(listEntity.ToArray()).ExecuteCommand();
        }


        /// <summary>
        /// 更新实体数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public async Task<bool> Update(TEntity entity)
        {
            //这种方式会以主键为条件
            return await Context.Updateable(entity).ExecuteCommandHasChangeAsync();
        }
        public bool Update(List<TEntity> entities)
        {
            return Context.Updateable(entities).ExecuteCommandHasChange();
        }
        /// <summary>
        /// 同步 更新
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int UpdateSync(TEntity entity)
        {
            //这种方式会以主键为条件
            return Context.Updateable(entity).ExecuteCommand();
        }
        /// <summary>
        /// 同步 更新批量
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public int UpdateSync(List<TEntity> entities)
        {
            return Context.Updateable(entities).ExecuteCommand();
        }



        /// <summary>
        /// 异步 更新实体
        /// </summary>
        /// <param name="entities"></param>
        /// <returns></returns>
        public async Task<int> UpdateAsync(List<TEntity> entities)
        {

            return await Context.Updateable(entities).ExecuteCommandAsync();

        }

        public async Task<bool> Update(TEntity entity, string strWhere)
        {
            return await Context.Updateable(entity).Where(strWhere).ExecuteCommandHasChangeAsync();
        }

        public async Task<bool> Update(string strSql, SugarParameter[] parameters = null)
        {
            return await Context.Ado.ExecuteCommandAsync(strSql, parameters) > 0;
        }

        public async Task<bool> Update(object operateAnonymousObjects)
        {
            return await Context.Updateable<TEntity>(operateAnonymousObjects).ExecuteCommandAsync() > 0;
        }

        public async Task<bool> Update(
          TEntity entity,
          List<string> lstColumns = null,
          List<string> lstIgnoreColumns = null,
          string strWhere = ""
            )
        {
            IUpdateable<TEntity> up = Context.Updateable(entity);
            if (lstIgnoreColumns != null && lstIgnoreColumns.Count > 0)
            {
                up = up.IgnoreColumns(lstIgnoreColumns.ToArray());
            }
            if (lstColumns != null && lstColumns.Count > 0)
            {
                up = up.UpdateColumns(lstColumns.ToArray());
            }
            if (!string.IsNullOrEmpty(strWhere))
            {
                up = up.Where(strWhere);
            }
            return await up.ExecuteCommandHasChangeAsync();
        }

        /// <summary>
        /// 根据实体删除一条数据
        /// </summary>
        /// <param name="entity">实体类</param>
        /// <returns></returns>
        public async Task<bool> Delete(TEntity entity)
        {
            return await Context.Deleteable(entity).ExecuteCommandHasChangeAsync();
        }

        /// <summary>
        /// 删除指定ID的数据
        /// </summary>
        /// <param name="id">主键ID</param>
        /// <returns></returns>
        public async Task<bool> DeleteById(object id)
        {
            return await Context.Deleteable<TEntity>(id).ExecuteCommandHasChangeAsync();
        }

        /// <summary>
        /// 删除指定ID集合的数据(批量删除)
        /// </summary>
        /// <param name="ids">主键ID集合</param>
        /// <returns></returns>
        public async Task<bool> DeleteByIds(object[] ids)
        {
            return await Context.Deleteable<TEntity>().In(ids).ExecuteCommandHasChangeAsync();
        }



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

        /// <summary>
        /// 功能描述:查询数据列表
        /// </summary>
        /// <param name="strWhere">条件</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(string strWhere)
        {
            return await Context.Queryable<TEntity>().WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToListAsync();
        }

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

        /// <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 Context.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 Context.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 Context.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>> Query(
            Expression<Func<TEntity, bool>> whereExpression,
            int intTop,
            string strOrderByFileds)
        {
            return await Context.Queryable<TEntity>().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).Take(intTop).ToListAsync();
        }

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



        /// <summary>
        /// 功能描述:分页查询
        /// </summary>
        /// <param name="whereExpression">条件表达式</param>
        /// <param name="intPageIndex">页码(下标0)</param>
        /// <param name="intPageSize">页大小</param>
        /// <param name="intTotalCount">数据总量</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(
            Expression<Func<TEntity, bool>> whereExpression,
            int intPageIndex,
            int intPageSize,
            string strOrderByFileds)
        {
            return await Context.Queryable<TEntity>().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(whereExpression != null, whereExpression).ToPageListAsync(intPageIndex, intPageSize);
        }

        /// <summary>
        /// 功能描述:分页查询
        /// </summary>
        /// <param name="strWhere">条件</param>
        /// <param name="intPageIndex">页码(下标0)</param>
        /// <param name="intPageSize">页大小</param>
        /// <param name="intTotalCount">数据总量</param>
        /// <param name="strOrderByFileds">排序字段,如name asc,age desc</param>
        /// <returns>数据列表</returns>
        public async Task<List<TEntity>> Query(
          string strWhere,
          int intPageIndex,
          int intPageSize,

          string strOrderByFileds)
        {

            return await Context.Queryable<TEntity>().OrderByIF(!string.IsNullOrEmpty(strOrderByFileds), strOrderByFileds).WhereIF(!string.IsNullOrEmpty(strWhere), strWhere).ToPageListAsync(intPageIndex, intPageSize);
        }




        /// <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> 
        /// <returns>值</returns>
        public async Task<List<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) where T : class, new()
        {
            if (whereLambda == null)
            {
                return await Context.Queryable(joinExpression).Select(selectExpression).ToListAsync();
            }
            return await Context.Queryable(joinExpression).Where(whereLambda).Select(selectExpression).ToListAsync();
        }

        /// <summary>
        /// 根据Sql查询集合
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<List<TEntity>> QuerySql(string sql)
        {
            return await Context.SqlQueryable<TEntity>(sql).ToListAsync();
        }





        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<List<TEntity>> SqlQueryTolist(string sql)
        {
            return await Context.Ado.SqlQueryAsync<TEntity>(sql);
        }
        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<List<T>> SqlQueryTolist<T>(string sql)
        {
            return await Context.Ado.SqlQueryAsync<T>(sql);
        }


        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<TEntity> SqlQuery(string sql)
        {
            return await Context.Ado.SqlQuerySingleAsync<TEntity>(sql);
        }
        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pairs"></param>
        /// <returns></returns>
        public async Task<T> SqlQuery<T>(string sql)
        {
            return await Context.Ado.SqlQuerySingleAsync<T>(sql);
        }

        /// <summary>
        /// 查询返回 集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sql"></param>
        /// <returns>返回List 集合</returns>
        public async Task<List<T>> SqlQuerys<T>(string sql)
        {
            return await Context.Ado.SqlQueryAsync<T>(sql);
        }

        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pairs"></param>
        /// <returns>返回List 集合</returns>
        public async Task<List<T>> SqlQuery<T>(string sql, Dictionary<string, object> pairs)
        {
            return await Context.Ado.SqlQueryAsync<T>(sql, FormationParameter(pairs).ToArray());
        }
        /// <summary>
        /// ADO 查询
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pairs"></param>
        /// <returns>返回List 集合</returns>
        public async Task<List<TEntity>> SqlQuery(string sql, Dictionary<string, object> pairs)
        {
            return await Context.Ado.SqlQueryAsync<TEntity>(sql, FormationParameter(pairs).ToArray());
        }

        /// <summary>
        /// ADO 执行 增删改方法
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public async Task<int> ExecuteCommand(string sql)
        {
            return await Context.Ado.ExecuteCommandAsync(sql);
        }



        /// <summary>
        /// ADO 执行 增删改方法
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="pairs"></param>
        /// <returns></returns>
        public async Task<int> ExecuteCommand(string sql, Dictionary<string, object> pairs)
        {
            return await Context.Ado.ExecuteCommandAsync(sql, FormationParameter(pairs).ToArray());
        }




        /// <summary>
        /// 获取序列自增ID
        /// </summary>
        /// <param name="tname">序列名</param>
        /// <param name="sequenceName">对应表名称</param>
        /// <returns></returns>
        public long getquery_id(string sequenceName, string tableName)
        {
            long myvar = 0;
            while (true)
            {
                string sql = "select " + sequenceName + ".NEXTVAL from dual ";
                try
                {
                    myvar = Context.Ado.SqlQuerySingle<long>(sql);

                    if (myvar > 0)
                    {
                        sql = "select count(*) from " + tableName + " where ID=" + myvar.ToString();
                        long myids = Context.Ado.SqlQuerySingle<long>(sql);
                        if (myids == 0)
                        {
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    loggers.Error(new LogContent("getquery_id", "获取序列异常", $"【序列获取失败】:{ex.Message}"));
                }
            }
            return myvar;
        }



        private List<SugarParameter> FormationParameter(Dictionary<string, object> pairs)
        {
            List<SugarParameter> olist = new List<SugarParameter>();
            if (pairs.Count > 0)
            {
                foreach (var item in pairs.Keys)
                {
                    olist.Add(new SugarParameter(item, pairs[item].ToString()));
                }
            }
            return olist;
        }

        /// <summary>
        ///  执行包体 方法(存储过程)
        /// </summary>
        /// <param name="packFuncName">imr_pkg_mr_data_syn.SP_SYN_SYS_USERS</param>
        /// <returns></returns>
        public System.Data.DataTable ExecStoredProcedure(string packFuncName, List<SugarParameter> olist)
        {
            try
            {

                System.Data.DataTable pack = Context.Ado.UseStoredProcedure().GetDataTable(packFuncName, olist.ToArray());
                return pack;
            }
            catch (Exception err)
            {

                throw err;
            }



        }


    }

3、配置文件

{
  "SqlSugarClient": [
    {
      "DbType": "3",
      "Connection": "User Id=TEST;Password=123456;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));Max Pool Size=512;Pooling=true",
      "InitKeyType":"1"
    }
  ],
  "SqlSugarClient2": [
    {
      "DbType": "3",
      "Connection": "User Id=TEST2;Password=123456;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));Max Pool Size=512;Pooling=true",
      "InitKeyType":"1"
    }
  ]
}

4、自定义读取json 文件

public class Config
    {

        /// <summary>
        /// 数据库连接
        /// </summary>
        public string ConnectionString { get; set; }

        /// <summary>
        /// 数据库类型
        /// </summary>
        public int DbType { get; set; }

        /// <summary>
        /// 默认读取实体表方式
        /// </summary>
        public int InitKeyType { get; set; }

        /// <summary>
        /// 是否自动提交事务
        /// </summary>
        public bool IsAutoCloseConnection { get; set; }

        /// <summary>
        /// 获取ConnectionConfig
        /// </summary>
        /// <returns></returns>
        public static Config getBean(string connectName = "SqlSugarClient")
        {
            string path = "";
            if (HttpContext.Current != null)
            {
                path = HttpContext.Current.Server.MapPath("/DbConfig.json");
            }
            else
            {
                path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "DbConfig.json");
            }
            using (StreamReader r = new StreamReader(path))
            {
                string json = r.ReadToEnd();
                JObject obj = JObject.Parse(json);
                var jToken = obj[$"{connectName}"][0];
                var conf = new Config()
                {
                    DbType = Convert.ToInt32(jToken["DbType"]),
                    ConnectionString = jToken["Connection"].ToString(),
                    InitKeyType = Convert.ToInt32(jToken["InitKeyType"]),
                    IsAutoCloseConnection = true
                };

                return conf;
            }

        }

    }

5、二级缓存类(SqlSugar官网提供)

/// <summary>
    ///  二级缓存
    /// </summary>
    public class HttpRuntimeCache : ICacheService
    {
        public void Add<V>(string key, V value)
        {
            HttpRuntimeCacheHelper<V>.GetInstance().Add(key, value);
        }

        public void Add<V>(string key, V value, int cacheDurationInSeconds)
        {
            HttpRuntimeCacheHelper<V>.GetInstance().Add(key, value, cacheDurationInSeconds);
        }

        public bool ContainsKey<V>(string key)
        {
            return HttpRuntimeCacheHelper<V>.GetInstance().ContainsKey(key);
        }

        public V Get<V>(string key)
        {
            return HttpRuntimeCacheHelper<V>.GetInstance().Get(key);
        }

        public IEnumerable<string> GetAllKey<V>()
        {
            return HttpRuntimeCacheHelper<V>.GetInstance().GetAllKey();
        }

        public V GetOrCreate<V>(string cacheKey, Func<V> create, int cacheDurationInSeconds = int.MaxValue)
        {
            var cacheManager = HttpRuntimeCacheHelper<V>.GetInstance();
            if (cacheManager.ContainsKey(cacheKey))
            {
                return cacheManager[cacheKey];
            }
            else
            {
                var result = create();
                cacheManager.Add(cacheKey, result, cacheDurationInSeconds);
                return result;
            }
        }

        public void Remove<V>(string key)
        {
            HttpRuntimeCacheHelper<V>.GetInstance().Remove(key);
        }
    }

    internal class HttpRuntimeCacheHelper<V>
    {

        #region 全局变量
        private static HttpRuntimeCacheHelper<V> _instance = null;
        private static readonly object _instanceLock = new object();
        #endregion

        #region 构造函数

        private HttpRuntimeCacheHelper() { }
        #endregion

        #region  属性
        /// <summary>         
        ///根据key获取value     
        /// </summary>         
        /// <value></value>      
        public V this[string key]
        {
            get { return (V)HttpRuntime.Cache[CreateKey(key)]; }
        }
        #endregion

        #region 公共函数

        /// <summary>         
        /// key是否存在       
        /// </summary>         
        /// <param name="key">key</param>         
        /// <returns> ///  存在<c>true</c> 不存在<c>false</c>.        /// /// </returns>         
        public bool ContainsKey(string key)
        {
            return HttpRuntime.Cache[CreateKey(key)] != null;
        }

        /// <summary>         
        /// 获取缓存值         
        /// </summary>         
        /// <param name="key">key</param>         
        /// <returns></returns>         
        public V Get(string key)
        {
            return (V)HttpRuntime.Cache.Get(CreateKey(key));
        }

        /// <summary>         
        /// 获取实例 (单例模式)       
        /// </summary>         
        /// <returns></returns>         
        public static HttpRuntimeCacheHelper<V> GetInstance()
        {
            if (_instance == null)
                lock (_instanceLock)
                    if (_instance == null)
                        _instance = new HttpRuntimeCacheHelper<V>();
            return _instance;
        }

        /// <summary>         
        /// 插入缓存(默认20分钟)        
        /// </summary>         
        /// <param name="key"> key</param>         
        /// <param name="value">value</param>          
        public void Add(string key, V value)
        {
            Add(key, value, 60 * 20);
        }

        /// <summary>         
        /// 插入缓存        
        /// </summary>         
        /// <param name="key"> key</param>         
        /// <param name="value">value</param>         
        /// <param name="cacheDurationInSeconds">过期时间单位秒</param>         
        public void Add(string key, V value, int cacheDurationInSeconds)
        {
            Add(key, value, cacheDurationInSeconds, CacheItemPriority.Default);
        }

        /// <summary>         
        /// 插入缓存.         
        /// </summary>         
        /// <param name="key">key</param>         
        /// <param name="value">value</param>         
        /// <param name="cacheDurationInSeconds">过期时间单位秒</param>         
        /// <param name="priority">缓存项属性</param>         
        public void Add(string key, V value, int cacheDurationInSeconds, CacheItemPriority priority)
        {
            string keyString = CreateKey(key);
            HttpRuntime.Cache.Insert(keyString, value, null,
            DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);
        }

        /// <summary>         
        /// 插入缓存.         
        /// </summary>         
        /// <param name="key">key</param>         
        /// <param name="value">value</param>         
        /// <param name="cacheDurationInSeconds">过期时间单位秒</param>         
        /// <param name="priority">缓存项属性</param>         
        public void Add(string key, V value, int
         cacheDurationInSeconds, CacheDependency dependency, CacheItemPriority priority)
        {
            string keyString = CreateKey(key);
            HttpRuntime.Cache.Insert(keyString, value,
             dependency, DateTime.Now.AddSeconds(cacheDurationInSeconds), Cache.NoSlidingExpiration, priority, null);
        }

        /// <summary>         
        /// 删除缓存         
        /// </summary>         
        /// <param name="key">key</param>         
        public void Remove(string key)
        {
            HttpRuntime.Cache.Remove(CreateKey(key));
        }

        /// <summary>
        /// 清除所有缓存
        /// </summary>
        public void RemoveAll()
        {
            System.Web.Caching.Cache cache = HttpRuntime.Cache;
            IDictionaryEnumerator CacheEnum = cache.GetEnumerator();
            ArrayList al = new ArrayList();
            while (CacheEnum.MoveNext())
            {
                al.Add(CacheEnum.Key);
            }
            foreach (string key in al)
            {
                cache.Remove(key);
            }
        }

        /// <summary>
        /// 清除所有包含关键字的缓存
        /// </summary>
        /// <param name="removeKey">关键字</param>
        public void RemoveAll(Func<string, bool> removeExpression)
        {
            System.Web.Caching.Cache _cache = HttpRuntime.Cache;
            var allKeyList = GetAllKey();
            var delKeyList = allKeyList.Where(removeExpression).ToList();
            foreach (var key in delKeyList)
            {
                HttpRuntime.Cache.Remove(key); ;
            }
        }

        /// <summary>
        /// 获取所有缓存key
        /// </summary>
        /// <returns></returns>
        public IEnumerable<string> GetAllKey()
        {
            IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
            while (CacheEnum.MoveNext())
            {
                yield return CacheEnum.Key.ToString();
            }
        }
        #endregion

        #region 私有函数

        /// <summary>         
        ///创建KEY   
        /// </summary>         
        /// <param name="key">Key</param>         
        /// <returns></returns>         
        private string CreateKey(string key)
        {
            return key;
        }
        #endregion
    }