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

时间:2012-02-04 14:04:56

标签: 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(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是否存在风险?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

由于这里讨论的原因,你基本上不需要Dispose()你的DataContext:

When should I dispose of a data context

http://csharpindepth.com/ViewNote.aspx?NoteID=89

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

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

另请注意,如果访问返回对象上的任何关系属性,则可能导致暂时重新打开连接,以便可以延迟加载属性。您可以通过将DataLoadOptions.LoadWith()与DataContext一起使用来急切加载您要访问的任何属性,从而避免这种情况。见http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspx

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