C# 为什么Linq2DB在处理DataContext之后执行SQL语句

C# 为什么Linq2DB在处理DataContext之后执行SQL语句,c#,sql,linq-to-sql,deferred-execution,linq2db,C#,Sql,Linq To Sql,Deferred Execution,Linq2db,我已经使用Linq2DB测试了以下代码: IQueryable<M> entities = null; using (var context = new DataContext("MySql", ConnectionString)) { entities = context.GetTable<M>(); } var list = entities.ToList(); return entities; IQueryable实体=null; 使用(var

我已经使用Linq2DB测试了以下代码:

IQueryable<M> entities = null;

using (var context = new DataContext("MySql", ConnectionString))  
{
    entities = context.GetTable<M>();
}

var list = entities.ToList();

return entities;
IQueryable实体=null;
使用(var context=newdatacontext(“MySql”,ConnectionString))
{
entities=context.GetTable();
}
var list=entities.ToList();
返回实体;

我想知道为什么即使处理了
DataContext
entities.ToList()
也会执行查询?

entities变量只包含对表的引用。您应该在上下文的范围内具体化您的数据,这样您就可以像smth一样执行smth

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;
IQueryable实体=null;
列表实体=null;
使用(var context=newdatacontext(“MySql”,ConnectionString))
{
entities=context.GetTable();
//在上下文范围内具体化实体
realEntities=entities.ToList();
}
返回实体;
您还可以在具体化之前执行一些过滤:

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();
}
使用(var context=newdatacontext(“MySql”,ConnectionString))
{
entities=context.GetTable();
//你可以在这里应用过滤器,它不会触发物化。
实体=实体。其中(e=>e.数量>50);
//那里到底发生了什么:
//1.筛选M表中的数据
//2.仅从数据库检索过滤后的数据
//并存储在realEntities变量(物化)中。
realEntities=entities.ToList();
}

有一个关于物化的问题,我建议您研究。

这就是
DataContext
的设计方法(与
DataConnection
上下文实现相比)。默认情况下,它仅为单个查询(或事务,如果您使用它)获取连接,并在执行查询/事务完成/处置后将其释放回池中,因此它是安全的


另一种情况是将
KeepConnectionAlive
设置为
true
。我怀疑在这种情况下,我们将有连接泄漏,所以我将填补这个问题。

我知道这一点。我想知道,为什么我可以在处理上下文之后进行物化呢?我认为在处理上下文之后不应该有任何联系,或者我错了?