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

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

cs 复制代码
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() 等方法时会抛异常或行为不确定。


🎯 调用方写法

cs 复制代码
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 块内部那条连接还有效的时候。

这就像是:

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

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


✅ 最保险的写法

你有两种路径:

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

cs 复制代码
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;
}

然后在调用方:

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

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

cs 复制代码
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博客

++仅供学习参考++

相关推荐
William_cl14 小时前
【C#/.NET 进阶】ASP.NET 架构与最佳实践:DI 依赖注入(IoC 核心)从入门到避坑
c#·asp.net·.net
武藤一雄14 小时前
WPF:MessageBox系统消息框
前端·microsoft·c#·.net·wpf
武藤一雄14 小时前
WPF进阶:万字详解WPF如何性能优化
windows·性能优化·c#·.net·wpf·.netcore·鲁棒性
唐青枫1 天前
别再层层传参了!C#.NET AsyncLocal 异步上下文透传实战
c#·.net
小邓的技术笔记2 天前
.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理
.net
夏霞2 天前
IIS 应用程序池 3 种标识:ApplicationPoolIdentity / LocalSystem / LocalService 权限区别(超清晰)
c#·.net
回忆2012初秋2 天前
Quartz.NET 全面解析与实战指南
.net
我是唐青枫2 天前
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
c#·.net
唐青枫3 天前
别再把增删改查写成一锅粥!C#.NET CQRS 从原理到实战
c#·.net
唐青枫3 天前
C#.NET ThreadLocal 深入解析:线程独享数据、性能收益与实战边界
c#·.net