C# LINQ到SQL调用存储过程

C# LINQ到SQL调用存储过程,c#,asp.net,linq,C#,Asp.net,Linq,我已经创建了一个小型的测试web应用程序,它使用LINQtoSQL。我有ObjectDataSource和GridView。GridView的数据源是ObjectDataSource。现在,这个ObjectDataSource使用一个名为MyTasks的类(方法名:GetAllTasks(),如下所述)使用Linq to SQL填充SQL中Tasks表中的所有task。它调用存储过程GetAllMyTasks() 我有下面的方法,效果很好 public static IEnumerable&l

我已经创建了一个小型的测试web应用程序,它使用LINQtoSQL。我有ObjectDataSource和GridView。GridView的数据源是ObjectDataSource。现在,这个ObjectDataSource使用一个名为MyTasks的类(方法名:GetAllTasks(),如下所述)使用Linq to SQL填充SQL中Tasks表中的所有task。它调用存储过程GetAllMyTasks()

我有下面的方法,效果很好

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    MyTasksDataContext db = new MyTasksDataContext();
    var tasks = db.GetAllMyTasks().Select(x => x);
    return tasks;
}
公共静态IEnumerable GetAllTasks()
{
MyTasksDataContext db=新建MyTasksDataContext();
var tasks=db.GetAllMyTasks().Select(x=>x);
返回任务;
}
现在,如果我尝试用下面的代码替换上面的代码,只是为了利用关键字创建一次性MyTasksDataContext对象。当读卡器关闭时,它给我错误提示“调用Read的尝试无效”。这里有我遗漏的东西吗

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    using (MyTasksDataContext db = new MyTasksDataContext())
    {
        var tasks = db.GetAllMyTasks().Select(x => x);
        return tasks;
    }
}
公共静态IEnumerable GetAllTasks()
{
使用(MyTasksDataContext db=new MyTasksDataContext())
{
var tasks=db.GetAllMyTasks().Select(x=>x);
返回任务;
}
}
谁能告诉我这背后的原因吗?我知道MyTasksDataContext对象正在调用其dispose方法。

使用
ToList()
扩展方法尽早计算枚举

public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    using (MyTasksDataContext db = new MyTasksDataContext())
    {
        return db.GetAllMyTasks().ToList();
    }
}
公共静态IEnumerable GetAllTasks()
{
使用(MyTasksDataContext db=new MyTasksDataContext())
{
返回db.GetAllMyTasks().ToList();
}
}
这将导致枚举发生在using内部,而不是在释放连接之后

枚举需要发生在“using”块内部的原因是LINQ使用了一种称为“延迟执行”的方法来允许更强大的查询写入

例如,如果您想要一个泛型函数进行分页,它可以将
.Skip(30).Take(10)
附加到结果的末尾,然后将该逻辑烘焙到结果SQL中

附言:
你说:

我知道我的任务是TACONTEXT 对象正在调用其dispose方法

这是错误的


“using”块调用的是
Dispose
方法,而不是对象本身。而且,正如John Gietzen所提到的,由于您使用编写了,您正在调用
Dispose
,ToList()将解决您眼前的问题


之所以有必要这样做,是因为延迟执行。通常,LINQ在查询被迭代之前不会做任何事情。LINQtoSQL将调用存储过程,但在迭代查询之前不会从结果中读取行

您也可以将其用作可枚举方法。lambda x=>x有什么关系,据我所知,它没有进行任何转换。@John:谢谢。这一变化对我确实起了作用。但你们能不能给我一个原因,为什么枚举在第一时间不起作用。默认情况下,方法的返回类型为ISingleResult。现在IsingResult确实实现了IEnumerable,IEnumerable.@PerformalCode:我用它来为使用lamda表达式的泛型委托函数提供方法实现。更新了一个延迟执行有用的示例。请注意,Select(x=>x)完全不起作用“LINQ to SQL将调用存储过程,但不会准确读取行”!它将在SQL Server中启动查询并使用
抢占式\u OS\u WAITFORSINGLEOBJEC将其冻结,直到您使用/dispose
IsingResult
(使用
ToList()
dispose()