使用语句 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,因为我认为这样可以更好地描述该对象)