佳佳的博客
Menu
首页
IT
生活
学生
游戏
随机
FluentData 中使用临时表
IT
FluentData
2019-11-12
目录
<!-- # FluentData 中使用临时表 --> <!-- use-temp-table-with-fluent-data --> 最近又开始做了一部分系统慢接口的优化,有个 SQL 优化时需要使用到临时表。 要先创建一个临时表并插入数据,然后在之后的查询中使用。 由于项目中 ORM 框架使用的是 [FluentData][1] ,需要通过特定的写法才能实现上述效果。 *FluentData* 是一个轻量级的 ORM 框架,性能还是比较高的。 如果使用 *DbContext* 的默认设置执行 SQL ,后面的查询中会报找不到临时表的异常。 这个是由于 *FluentData* 默认设置每次查询是要创建一个新连接的(由于 *SqlConnection* 默认是开启连接池的,这样做本身并没有什么问题),这就导致创建临时表的会话和后面使用临时表的会话并不是同一个会话,而 *#t* 临时表只能在当前会话中访问,所以就发生了异常。 *FluentData* 的 *IDbContext* 接口提供了一个 *UseSharedConnection* 方法: ```csharp IDbContext UseSharedConnection(bool useSharedConnection); ``` 调用该方法并传递参数为 `true` 时,之后 *IDbContext* 实例中执行的 SQL 都会使用同一个 *Connection* 。 使用方法如下: ```csharp using (var db = dbContext.UseSharedConnection(true)) { // do something db.Sql(tempSql).Execute(); // 创建临时表 // 执行其它 SQL } ``` 建议用 *using* 将 *dbContext* 包起来。因为 *UseSharedConnection* 为 *false* 时每个 *DbCommand* 执行结束后都会自动关闭数据库连接(返回到连接池),而 *UseSharedConnection* 为 *true* 时则只有在 *dbContext* 被注销时才会关闭连接。 有一点要注意的是在使用 *using* 语法时,*using* 结束后 *UseSharedConnection* 的值仍然为 *true*,如果后面仍有查询,需要手动根据情况再次设置。 <!-- 参考 --> [1]: https://www.liujiajia.me/blog?t=fluentdata&c=0 (FluentData) [2]: https://www.cnblogs.com/eaglet/archive/2011/10/31/2230197.html (正确理解 SqlConnection 的连接池机制)
版权声明:原创文章,未经允许不得转载。
https://www.liujiajia.me/2019/11/12/use-temp-table-with-fluent-data
« C# 8.0 中的新增功能
Visual Studio Code 快捷键(Windows) »
昵称
*
电子邮箱
*
回复内容
*
(回复审核后才会显示)
提交