c# - 使用围绕 DB 上下文的 using 确定 LINQ 语句的范围
问题描述
我有一个返回查询结果以进行进一步过滤的函数,如下所示:
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()
返回或何时ToList()
结束f()
?
如果是前者,我该如何更改它以便在ToList()
完成时处理 DB 上下文?
(注意:我知道通常不需要在 EF 中使用 around 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
返回后IQueryable
,上下文很可能会立即处理(甚至在调用之前.Select(v => ......
)。
让调用者处理上下文有点“干净”。您可以在函数之外创建一个上下文对象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();
...
}
}
总体思路很简单,建议不要使事情过于复杂:
- 创建数据库上下文
- 做任何你需要做的事情
- 丢弃它
推荐阅读
- javascript - 如何将“attr”绑定元素设置为不正确?
- python - python中的动态数据库操作
- amazon-web-services - 使用 AWS API Gateway 验证会话
- vb.net - Unity 框架的表达式预期异常
- css - 向下滚动Angular时显示导航栏
- php - 亚马逊供应商 v1 api 股票代码信息不来
- javascript - 记录集合:JavaScript 中的“If”语句
- java - Jersey 如何知道为带有 @Context 注释的类字段注入哪个 Provider?
- python - (单工)UWSGI 线程应该等于 Flask app.py 中的线程吗?
- javascript - 使用引导反应组件与引导类名称之间有区别吗?