【问题标题】: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 已被释放?

【问题讨论】:

    标签: c# sql linq-to-sql deferred-execution linq2db


    【解决方案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。我怀疑在这种情况下我们会有连接泄漏,所以我会为它填写问题。

    【讨论】:

      猜你喜欢
      • 2019-04-12
      • 2022-01-07
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多