LINQPad / LINQ To SQL - простой запрос выбрасывает из памяти только при выполнении внутри цикла - PullRequest
1 голос
/ 02 февраля 2020

У меня есть база данных со следующими отношениями:

Вычисления -

Мне нужно l oop все вычисления и затем запросить соответствующие строки BinaryData. Запрос для BinaryData представляет собой простое предложение where в BinaryData.bdCalculationKey. Выполнение этого запроса немедленно возвращается, когда он выполняется автономно, но при выполнении его внутри цикла вычислений он выдает исключение из памяти. Код выглядит следующим образом:

var groupName = "NYPH";
var serverName = "192.168.100.132";

var tahitiDB = 
    new BTR.Evolution.Data.DataContexts.Legacy.Profile.BtrProfile( 
        BTR.Evolution.Core.Registry.ProfileDatabase( groupName, serverName ) 
    ) { ObjectTrackingEnabled = false, DeferredLoadingEnabled = false, CommandTimeout = 30 };

var data = tahitiDB.Calculations.Where(c => c.Profile.Client.cName == groupName && !c.calcIsFailed);

data.Count().Dump();

tahitiDB.BinaryDatas
        .Where(b => b.bdCalculationKey == new Guid( "3d53aa12-0353-e911-83b4-005056b9729f" ) )
        .Dump();

foreach( var p in data )
{
    p.calcKey.Dump();
    tahitiDB.BinaryDatas
            .Where(b => b.bdCalculationKey == p.calcKey )
            .Select(b => new { b.bdKey, b.bdCalculationKey, b.bdFilename, b.bdDateCreated })
            .Dump();

    break;
}

Вот снимок экрана с результатом LINQPad (также показан успешный дамп запроса за пределами l oop):

enter image description here

Обновление : Я полагаю, что голосование "за" закрыто из-за запрошенной информации из комментария. Полный код указан выше. Не уверен, что еще можно сказать о Таити. Это просто скомпилированный L2S DataContext. При необходимости я могу опубликовать тысячи строк сгенерированного кода. Что касается таблиц Calculations и BinaryData, обе таблицы имеют первичные ключи Guid. В вычислениях есть метки времени создания / обновления, пара «битовых / логических» флагов о состоянии, несколько внешних ключей Guid и два столбца BLOB-объектов Xml для хранения входных данных и данных для расчета. BinaryData имеет метки времени создания / обновления, несколько текстовых полей для имени / типа двоичных данных, несколько внешних ключей Guid (в зависимости от того, кому принадлежат двоичные данные) и поле содержимого Binary для фактического кэшированного документа.

1 Ответ

0 голосов
/ 03 февраля 2020

Учитывая, что вы не производите обновления, вы должны отключить отслеживание объектов, чтобы не хранить все объекты базы данных в памяти:

this.ObjectTrackingEnabled = false;
...