LINQPad / LINQ To SQL-仅在循环内执行时,简单查询才会抛出内存不足

问题描述 投票:-1回答:1

我有一个具有以下关系的数据库:

计算-

我需要循环所有计算,然后查询关联的BinaryData行。 BinaryData的查询是BinaryData.bdCalculationKey上的简单where子句。当独立运行该查询时,立即返回运行该查询,但是在“计算”循环中运行该查询时,它将抛出内存不足异常。代码看起来像这样:

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结果的屏幕截图(还显示了查询outside循环的成功转储):

enter image description here

更新:我想结束投票是因为评论中要求提供信息。上面列出的完整代码。不知道关于tahitiDB还有什么要说的。它只是一个已编译的L2S DataContext。如果需要,我可以发布1000行的生成代码。对于CalculationsBinaryData表,两个表都具有Guid主键。计算具有创建/更新时间戳,关于状态的“位/布尔”标志,几个Guid外键以及两个Xml blob列,用于存储输入和数据以进行计算。 BinaryData具有创建/更新时间戳,用于二进制数据名称/类型的“文本”字段很少,用于外部缓存文​​件的Guid外键(基于谁拥有二进制数据)和用于实际缓存文档的“二进制”内容字段很少。

sql linq-to-sql locking linqpad
1个回答
0
投票

鉴于您没有进行更新,应该禁用对象跟踪以避免将所有数据库对象保留在内存中:

this.ObjectTrackingEnabled = false;
© www.soinside.com 2019 - 2024. All rights reserved.