为啥 Linq2DB 在处理 DataContext 后执行 SQL 语句
Posted
技术标签:
【中文标题】为啥 Linq2DB 在处理 DataContext 后执行 SQL 语句【英文标题】:Why is Linq2DB executing SQL-Statement after disposing DataContext为什么 Linq2DB 在处理 DataContext 后执行 SQL 语句 【发布时间】:2020-01-06 17:24:13 【问题描述】:我已经用 Linq2DB 测试了以下代码:
IQueryable<M> entities = null;
using (var context = new DataContext("mysql", ConnectionString))
entities = context.GetTable<M>();
var list = entities.ToList();
return entities;
我想知道为什么 entities.ToList()
处的查询被执行,即使 DataContext
已被释放?
【问题讨论】:
【参考方案1】:entities
变量只包含对表的引用。您应该在上下文范围内具体化您的数据,这样您就可以这样做
IQueryable<M> entities = null;
List<M> realEntities = null;
using (var context = new DataContext("MySql", ConnectionString))
entities = context.GetTable<M>();
// materialize entities in scope of the context
realEntities = entities.ToList();
return realEntities;
您还可以在具体化之前执行一些过滤:
using (var context = new DataContext("MySql", ConnectionString))
entities = context.GetTable<M>();
// you can apply Where filter here, it won't trigger the materialization.
entities = entities.Where(e => e.Quantity > 50);
// what exactly happens there:
// 1. Data from the M table is filtered
// 2. The filtered data only is retrieved from the database
// and stored in the realEntities variable (materialized).
realEntities = entities.ToList();
有一个关于物化的topic,我建议你研究一下。
【讨论】:
我知道这一点。我想知道,为什么我可以在处理上下文之后进行物化?我认为在处理上下文后应该没有连接等 - 还是我错了?【参考方案2】:DataContext
就是这样设计的(与 DataConnection
上下文实现相比)。默认情况下,它只为单个查询(或事务,如果你使用它)获取连接,并在查询执行/事务完成/处置后将其释放回池,因此它是安全的。
另一种情况是将KeepConnectionAlive
设置为true
。我怀疑在这种情况下我们会有连接泄漏,所以我会为它填写问题。
【讨论】:
以上是关于为啥 Linq2DB 在处理 DataContext 后执行 SQL 语句的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataContext 为 ListView 项目之外的项目返回空值?
linq2db Sqlite Insert之后获取插入的自增量ID值