Использование оператора возвращаемого типа ссылки - PullRequest
0 голосов
/ 03 октября 2018

Я использую 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

1 Ответ

0 голосов
/ 03 октября 2018

Вы очень близки с вашими последними обновлениями.Вы правы, что речь идет о ленивой / энергичной загрузке.Но вы не смогли указать, что конкретный объект контекста до использует параметры , которые вы настроили:

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, потому что я думаю, что это лучше описывает, что это за объект)

...