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

.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博客

仅供学习参考 

http://www.xdnf.cn/news/1100.html

相关文章:

  • python兴趣匹配算法
  • <四级英语词汇> 2025.4.22
  • Cesium学习笔记——坐标系统及坐标转换
  • 文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析
  • 【深度学习】#8 循环神经网络
  • 日常记录-logback脱敏
  • 【扫描件批量改名】批量识别扫描件PDF指定区域内容,用识别的内容修改PDF文件名,基于C++和腾讯OCR的实现方案,超详细
  • 4.22学习总结
  • Spring Web MVC入门
  • Apache SeaTunnel:新一代开源、高性能数据集成工具
  • 【2025最新Java面试八股】如何理解MySQL的MVCC机制?
  • 安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型
  • Oracle--SQL性能优化与提升策略
  • 类加载器与jvm的内存
  • 数据库性能优化(sql优化)_分布式优化思路02_yxy
  • uniapp开发2--uniapp中的条件编译总结
  • 探索科技的边界:代理IP与汽车产业链的创新之旅
  • 使用 LlamaIndex Workflows 与 Elasticsearch
  • LeetCode 热题 100_分割等和子集(89_416_中等_C++)(动态规划)
  • 数据孤岛、技术断层、ROI迷雾:传统企业数字化转型的三大坑,如何破局?
  • JAVA设计模式——(二)组合模式
  • 【MQ篇】RabbitMQ之简单模式!
  • 多模态知识图谱:重构大模型RAG效能新边界
  • 【Go】重难点知识汇总
  • python包管理器,conda和uv 的区别
  • JDBC对数据的增删改查操作:从Statement到PrepareStatement
  • Qt开发:软件崩溃时,如何生成dump文件
  • IDEA中如何统一项目名称/复制的项目如何修改根目录名称
  • 利用 SSH 实现 WordPress 网站的全面安全管理
  • 【Web API系列】Web Shared Storage API 深度解析:WindowSharedStorage 接口实战指南