C# 确定LINQ语句的范围,并在DB上下文中使用

C# 确定LINQ语句的范围,并在DB上下文中使用,c#,entity-framework,linq,entity-framework-6,c#-7.0,C#,Entity Framework,Linq,Entity Framework 6,C# 7.0,我有一个函数,它返回查询结果以进行进一步筛选,如下所示: public IQueryable<MyData> Query(string name) { using (var dbc = new MyDbContext()) return dbc.MyData.Where(v => v.Name == name); } 在这种情况下,MyDbContext的范围是什么?什么时候处理?当Query()返回或f()中的ToList()完成时 如果是前者,我如何更改它,

我有一个函数,它返回查询结果以进行进一步筛选,如下所示:

public IQueryable<MyData> Query(string name) {
  using (var dbc = new MyDbContext()) 
    return dbc.MyData.Where(v => v.Name == name);
}
在这种情况下,
MyDbContext
的范围是什么?什么时候处理?当
Query()
返回或
f()中的
ToList()
完成时

如果是前者,我如何更改它,以便在
ToList()
完成时释放DB上下文

(注意:我知道在EF中通常不需要使用Abround DbContext,但我希望在这种情况下使用它,因为我正在尝试解决sqlite锁定问题)


谢谢

那么,
使用
子句只是一个
try finally
块。因此,
Query
将被转换为如下内容:

public IQueryable<MyData> Query(string name) {
  MyDbContext dbc;

  dbc = new MyDbContext();
  try
  {

     return dbc.MyData.Where(v => v.Name == name);
  }
  finally
  {
     dbc.Dispose();
  }   
}
总体思路很简单,建议不要将事情过于复杂:

  • 创建dbcontext
  • 用它做任何你需要做的事
  • 处理它
  • public IQueryable<MyData> Query(string name) {
      MyDbContext dbc;
    
      dbc = new MyDbContext();
      try
      {
    
         return dbc.MyData.Where(v => v.Name == name);
      }
      finally
      {
         dbc.Dispose();
      }   
    }
    
    public IQueryable<MyData> Query(MyDbContext dbc, string name) {
         return dbc.MyData.Where(v => v.Name == name);
    }
    
    public f() { 
      using(var dbc = new MyDbContext())
      {
          var res = Query(dbc, "john").Select(v => ......
          var resList = res.ToList();
          ...
      }      
    }