使用 using around the DB context 确定 LINQ 语句的范围
Determining the scope of LINQ statement with a using around the DB context
我有一个函数 returns 查询结果可以像这样进一步过滤:
public IQueryable<MyData> Query(string name) {
using (var dbc = new MyDbContext())
return dbc.MyData.Where(v => v.Name == name);
}
然后我在另一个函数中调用它:
public f() {
var res = Query("john").Select(v => ......
var resList = res.ToList();
...
}
在这种情况下 MyDbContext
的范围是什么?它什么时候处置?当 Query()
returns 或 ToList()
in f()
完成时?
如果是前者,我该如何更改它以便在 ToList()
完成时处理数据库上下文?
(注意:我知道通常不需要在 EF 中使用 DbContext,但在这种情况下我想要它,因为我正在尝试解决 sqlite 锁定问题)
谢谢!
嗯,using
子句只是一个 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();
}
}
在 Query
returns IQueryable
之后,上下文很可能会立即被释放(甚至在调用 .Select(v => ......
之前)。
让调用者处置上下文有点 'cleaner'。您可以在 Query
函数之外创建一个上下文对象并将其作为参数传递:
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();
...
}
}
总体思路很简单,建议不要过于复杂:
- 创建数据库上下文
- 用它做任何你想做的事
- 处理它
我有一个函数 returns 查询结果可以像这样进一步过滤:
public IQueryable<MyData> Query(string name) {
using (var dbc = new MyDbContext())
return dbc.MyData.Where(v => v.Name == name);
}
然后我在另一个函数中调用它:
public f() {
var res = Query("john").Select(v => ......
var resList = res.ToList();
...
}
在这种情况下 MyDbContext
的范围是什么?它什么时候处置?当 Query()
returns 或 ToList()
in f()
完成时?
如果是前者,我该如何更改它以便在 ToList()
完成时处理数据库上下文?
(注意:我知道通常不需要在 EF 中使用 DbContext,但在这种情况下我想要它,因为我正在尝试解决 sqlite 锁定问题)
谢谢!
嗯,using
子句只是一个 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();
}
}
在 Query
returns IQueryable
之后,上下文很可能会立即被释放(甚至在调用 .Select(v => ......
之前)。
让调用者处置上下文有点 'cleaner'。您可以在 Query
函数之外创建一个上下文对象并将其作为参数传递:
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();
...
}
}
总体思路很简单,建议不要过于复杂:
- 创建数据库上下文
- 用它做任何你想做的事
- 处理它