使用语句返回引用类型



我正在使用Linq到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);
}
}

但是似乎我返回的MyObj被"半处理",因为当我尝试访问它的成员时,它们都变成了空。这样:

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

有没有办法使用 ObjectTrackingEnabled = false 而不会丢失返回值上的数据,或者我可以在返回值类型时只使用此"模式"?我想我需要在返回后对我想使用的成员对象强制加载,所以我尝试添加 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

您已经非常接近最新更新。你是对的,这是关于懒惰/急切加载的。但是您未能告诉该特定上下文对象使用您配置的选项:

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,因为我认为这更好地描述了该对象是什么(

最新更新