Я использую 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);
}
}
Но кажется, что MyObj, который я возвращаю, «наполовину утилизируется», потому что когда я пытаюсь получить доступ к его членам, все они оказываются нулевыми.Вот так:
var myObj = GetMyObj(10);
var test = myObj.MyMember.Count(); // MyMember is now null, but shouldn't be
Однако, если я не использую, тогда я получаю правильный счетчик ():
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