Sql LINQ函数和DataContext处理,延迟执行
所以我需要一些建议和见解。提前感谢您的想法 我开发了从LINQ实体返回单个记录的静态函数。像这样: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(
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当然会像任何其他对象一样被垃圾收集