使用语句 return 引用类型
Using statement return reference type
我正在使用 Linq to SQL 并且为了优化,我想将 DataContext.ObjectTrackingEnabled 设置为 false,以便我不需要更改或添加对象的查询。在我的应用程序中,我有一个到处都在使用的 DataContext,因此为了将 ObjectTrackingEnabled 设置为 false,我需要创建一个新的 DataContext。所以我想做这样的事情:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
但我正在 returning 的 MyObj 似乎得到了 "half disposed",因为当我尝试访问它的成员时,它们全都为空。像这样:
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is now null, but shouldn't be
但是,如果我不使用,则会得到正确的 Count():
public static MyObj GetMyObj(long id)
{
var dc = DCManager.Get("myDataContext") // gets the normal DC that's used throughout the application
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is now not null and its Count() is not 0
有没有一种方法可以在不丢失 return 值数据的情况下使用 ObjectTrackingEnabled = false,或者我可以只在 returning 值类型时使用此 "pattern" 吗?我想我需要在 return 之后强制预先加载我想使用的成员对象,所以我尝试添加 DataLoadOptions.LoadWith 但我仍然没有得到底层对象:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
DataLoadOptions load = new DataLoadOptions();
load.LoadWith<MyObj>(d => d.MyMember);
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is null which it shouldn't be
您已经非常接近最新的更新了。你是对的,这是关于 lazy/eager 加载。但是您未能告知 您已配置的特定上下文对象 use the options:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
DataLoadOptions load = new DataLoadOptions();
load.LoadWith<MyObj>(d => d.MyMember);
dc.LoadOptions = load; //<-- New line
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is null which it shouldn't be
(作为偏好,我还将 load
重命名为 options
,因为我认为这样可以更好地描述该对象)
我正在使用 Linq to SQL 并且为了优化,我想将 DataContext.ObjectTrackingEnabled 设置为 false,以便我不需要更改或添加对象的查询。在我的应用程序中,我有一个到处都在使用的 DataContext,因此为了将 ObjectTrackingEnabled 设置为 false,我需要创建一个新的 DataContext。所以我想做这样的事情:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
但我正在 returning 的 MyObj 似乎得到了 "half disposed",因为当我尝试访问它的成员时,它们全都为空。像这样:
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is now null, but shouldn't be
但是,如果我不使用,则会得到正确的 Count():
public static MyObj GetMyObj(long id)
{
var dc = DCManager.Get("myDataContext") // gets the normal DC that's used throughout the application
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is now not null and its Count() is not 0
有没有一种方法可以在不丢失 return 值数据的情况下使用 ObjectTrackingEnabled = false,或者我可以只在 returning 值类型时使用此 "pattern" 吗?我想我需要在 return 之后强制预先加载我想使用的成员对象,所以我尝试添加 DataLoadOptions.LoadWith 但我仍然没有得到底层对象:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
DataLoadOptions load = new DataLoadOptions();
load.LoadWith<MyObj>(d => d.MyMember);
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is null which it shouldn't be
您已经非常接近最新的更新了。你是对的,这是关于 lazy/eager 加载。但是您未能告知 您已配置的特定上下文对象 use the options:
public static MyObj GetMyObj(long id)
{
using (MyDataContext dc = new MyDataDataContext("connectionstring"))
{
dc.ObjectTrackingEnabled = false;
DataLoadOptions load = new DataLoadOptions();
load.LoadWith<MyObj>(d => d.MyMember);
dc.LoadOptions = load; //<-- New line
return dc.MyObjs.FirstOrDefault(x => x.ID == id);
}
}
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is null which it shouldn't be
(作为偏好,我还将 load
重命名为 options
,因为我认为这样可以更好地描述该对象)