【问题标题】:Using statement return reference type使用语句返回引用类型
【发布时间】: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


【解决方案1】:

您的最新更新非常接近。没错,这是关于延迟/急切加载。但是你没有告诉 那个特定的上下文对象给你配置的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,因为我认为这样可以更好地描述该对象是什么)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2019-06-17
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多