Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql LINQ函数和DataContext处理,延迟执行_Sql_Linq_Idisposable_Deferred Execution - Fatal编程技术网

Sql LINQ函数和DataContext处理,延迟执行

Sql LINQ函数和DataContext处理,延迟执行,sql,linq,idisposable,deferred-execution,Sql,Linq,Idisposable,Deferred Execution,所以我需要一些建议和见解。提前感谢您的想法 我开发了从LINQ实体返回单个记录的静态函数。像这样: FooRecord GetRecord(Guid id) { using(var dc = new FooDataContext()) return dc.FooRecords.Where(a => a.Id == id).First(); } 这会引发异常,因为DataContext已被释放,这会造成延迟执行的问题。这项工作: FooRecord GetRecord(

所以我需要一些建议和见解。提前感谢您的想法

我开发了从LINQ实体返回单个记录的静态函数。像这样:

FooRecord GetRecord(Guid id)
{
   using(var dc = new FooDataContext())
       return dc.FooRecords.Where(a => a.Id == id).First();
}
这会引发异常,因为DataContext已被释放,这会造成延迟执行的问题。这项工作:

FooRecord GetRecord(Guid id)
{
       var dc = new FooDataContext();
       return dc.FooRecords.Where(a => a.Id == id).First();
}
我很担心。DataContext的处理速度有多快?很明显,如果我立即抓取记录,这不会引起问题。但是,假设我需要通过关联获取记录:

var record = Data.FooRecord.GetRecord(id);
//Do a bunch of stuff...
//Now we grab the related record from another entity
var barRecord = record.BarRecord

此时是否存在DataContext消失的风险?有什么建议吗?

您基本上不需要处理()您的DataContext,原因如下:

在类型上实现IDisposable的主要原因是处置任何非托管资源。DataContext分配的唯一非托管资源是底层数据库连接,但DataContext已经负责根据需要打开和关闭连接

您要避免的主要问题是返回IEnumerable集合,然后从不枚举它,因为这将导致连接无限期保持打开状态。但是,由于您只返回一个对象,因此不必担心这一点

还要注意,如果访问返回对象上的任何关系属性,可能会导致连接暂时重新打开,以便可以延迟加载该属性。可以通过在DataContext中使用DataLoadOptions.LoadWith()来避免这种情况,以便加载您想要访问的任何属性。看

至于问题的最后一部分,如果返回的实体包含可以延迟加载的属性,那么它们将包含内部引用以支持将其保留在内存中的DataContext。一旦不再引用这些实体,那么DataContext当然会像任何其他对象一样被垃圾收集