【发布时间】:2018-10-03 08:41:50
【问题描述】:
我正在使用 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 被“处理了一半”,因为当我尝试访问它的成员时,它们都变成了 null。像这样:
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
【问题讨论】:
-
使用 obj 作为返回类型而不是 MyObj。
-
你的意思是“公共静态对象GetMyObj(long id)”吗?
-
是的。我忘了放链接:github.com/sankarr/Nmodbus/blob/master/Modbus/Device/… 和线路:私有静态字节 ModbusId;
-
让该方法返回一个对象而不是 MyObj 并且没有更改任何内容,而且我看不出该代码与解决我的问题有什么关系。不过感谢您的宝贵时间。
-
您正在返回 FirstOrDefault(),然后在您只返回一项时尝试获取第 10 项。
标签: c# linq-to-sql using datacontext eager-loading