我有一个具有以下关系的数据库:
计算- 我需要循环所有计算,然后查询关联的BinaryData行。 BinaryData的查询是BinaryData.bdCalculationKey上的简单where子句。当独立运行该查询时,立即返回运行该查询,但是在“计算”循环中运行该查询时,它将抛出内存不足异常。代码看起来像这样: 这里是LINQPad结果的屏幕截图(还显示了查询outside循环的成功转储): 更新:我想结束投票是因为评论中要求提供信息。上面列出的完整代码。不知道关于tahitiDB还有什么要说的。它只是一个已编译的L2S 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;
}
DataContext
。如果需要,我可以发布1000行的生成代码。对于Calculations
和BinaryData
表,两个表都具有Guid主键。计算具有创建/更新时间戳,关于状态的“位/布尔”标志,几个Guid外键以及两个Xml blob列,用于存储输入和数据以进行计算。 BinaryData具有创建/更新时间戳,用于二进制数据名称/类型的“文本”字段很少,用于外部缓存文件的Guid外键(基于谁拥有二进制数据)和用于实际缓存文档的“二进制”内容字段很少。
鉴于您没有进行更新,应该禁用对象跟踪以避免将所有数据库对象保留在内存中:
this.ObjectTrackingEnabled = false;