当前位置: 首页 > news >正文

.NET仓储层在 using 块中创建 SqlSugarClient 的风险

如题,先看代码示例 using 块的使用

public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression = null)
{using (SqlSugarClient dbClient = SqlSugarInstance.GetInstance()){var query = dbClient.Queryable<T>();if (whereExpression != null){query = query.Where(whereExpression);}return query;}
}

使用 using 导致返回的 ISugarQueryable<T> 会因为连接释放而失效

你在 using 块中创建了 SqlSugarClient,然后返回了基于它创建的 ISugarQueryable<T>。但 using 会在方法结束时释放资源,这意味着你返回的查询对象里的连接已经被释放,后续在调用 .ToList().First() 等方法时会抛异常或行为不确定。


🎯 调用方写法

var entity = _IWI_ZoneFolderRepository.GetSet(s => s.ZoneFolderCode.Equals(zoneFolderRemoveModel.FolderCode)).Take(1).ToList().FirstOrDefault();

🎯 为什么现在没出问题?

因为 SqlSugar 的 ISugarQueryable<T> 是个延迟执行(lazy evaluation)的查询对象,但你在调用完 .GetSet()马上调用了 .Take(1).ToList(),所以真正执行 SQL 查询的时机仍然落在了 using 块内部那条连接还有效的时候。

这就像是:

var query = db.Queryable<T>(); // 还没执行 SQL
var result = query.ToList();   // 这才执行 SQL,必须连接还活着

你现在这用法,是 立即执行型消费,所以目前没翻车。


✅ 最保险的写法

你有两种路径:

方式 1:调用者控制连接(推荐)

public ISugarQueryable<T> GetSet(SqlSugarClient dbClient, Expression<Func<T, bool>> where = null)
{var query = dbClient.Queryable<T>();if (where != null) query = query.Where(where);return query;
}

然后在调用方:

using var db = SqlSugarInstance.GetInstance();
var entity = _repo.GetSet(db, x => x.Id == 1).Take(1).ToList().FirstOrDefault();

方式 2:改为立即执行,返回结果

public T GetOne(Expression<Func<T, bool>> where)
{using var db = SqlSugarInstance.GetInstance();return db.Queryable<T>().Where(where).FirstOrDefault();
}

✅ 总结建议

情况建议做法
想要返回 ISugarQueryable<T>不要在方法内部 using 释放连接
想在方法里执行查询使用 ToList() / FirstOrDefault() 立即执行,返回结果
想安全复用查询表达式由调用方提供 SqlSugarClient,连接生命周期在外层控制

🔍using 块的本意请参考这篇

.NET下 using 块的作用-CSDN博客

仅供学习参考 

相关文章:

  • 射频系统级芯片集成技术研究
  • echarts模板化开发,简易版配置大屏组件-根据配置文件输出图形和模板(vue2+echarts5.0)
  • Vue 3 Watch 监听 Props 的踩坑记录
  • Git常用操作命令
  • Qt 下载的地址集合
  • 【Maven】配置文件
  • audio 核心服务AudioPolicyService 和AudioFlinger启动流程
  • jsconfig.json文件的作用
  • 【SAP-CO】生产的成本流转和成本分析
  • Spark-Streaming
  • 【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
  • 软件测试之接口测试常见面试
  • 第48讲:空间大数据与智慧农业——时空大数据分析与农业物联网的融合实践
  • ecovadis评级范围,如何拿到ecovadis评级高分
  • 局域网内,将linux(Ubuntu)的硬盘映射成Windows上,像本地磁盘一样使用
  • 健康生活新指南
  • ESM 内功心法:化解 require 中的夺命一击!
  • Spring 中 @Component, @Repository, @Service 的区别及示例代码
  • 学习Docker遇到的问题
  • 广州市白云区粤荣职业培训学校副校长余智强获聘广州培训质量督导员
  • 厦门国贸去年营收约3544亿元,净利润同比减少67.3%
  • 网上销售假冒片仔癀和安宫牛黄丸,两人被判刑
  • 上金所:调整黄金、白银延期部分合约保证金水平和涨跌停板
  • 北朝时期的甲胄
  • 京东美团商战,能惠及骑手吗?
  • 亮相!神二十乘组与中外媒体记者集体见面