gpt4 book ai didi

c# - LINQ to SQL调用存储过程

转载 作者:行者123 更新时间:2023-11-30 19:04:01 25 4
gpt4 key购买 nike

我创建了使用 LINQ to SQL 的小型测试 Web 应用程序。我有 ObjectDataSource 和 GridView。 GridView 的数据源是 ObjectDataSource。现在这个 ObjectDataSource 使用一个名为 MyTasks 的类(方法名称:GetAllTask​​s(),如下所述)使用 Linq to SQL 填充 SQL 中任务表中的所有任务。它调用存储过程 GetAllMyTasks()。

我有以下方法,效果很好。

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
MyTasksDataContext db = new MyTasksDataContext();
var tasks = db.GetAllMyTasks().Select(x => x);
return tasks;
}

现在,如果我尝试用以下代码替换上面的代码,只是为了利用使用关键字来创建 Disposable MyTasksDataContext 对象。它给我一个错误,说“阅读器关闭时调用 Read 的尝试无效。”。有什么我在这里遗漏的吗?

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
using (MyTasksDataContext db = new MyTasksDataContext())
{
var tasks = db.GetAllMyTasks().Select(x => x);
return tasks;
}
}

谁能告诉我这背后的原因?我知道我的 MyTasksDataContext 对象正在调用它的 dispose 方法。

最佳答案

使用 ToList() 扩展方法尽早评估枚举。

public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
using (MyTasksDataContext db = new MyTasksDataContext())
{
return db.GetAllMyTasks().ToList();
}
}

这将导致枚举发生在使用中,而不是在连接被释放之后。

枚举需要在“using” block 内部发生的原因是 LINQ 使用称为“延迟执行”的东西来允许更强大的查询编写。

例如,如果您想要一个通用函数来进行分页,它可以将 .Skip(30).Take(10) 附加到结果的末尾,该逻辑可以是烘焙到生成的 SQL 中。

附言:
你说:

I know that my MyTasksDataContext object is calling its dispose method.

这是错误的。

'using'-block 正在调用 Dispose 方法,而不是对象本身。而且,由于编写了using,正在调用Dispose

关于c# - LINQ to SQL调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com