我的应用程序的一部分使用存储在SQL数据库中的道路名称。该应用程序将至少访问每个名称记录一次,大多数记录将被多次访问。因此,我决定将名称数据加载到字典中,然后进行查找以减少数据库读取。
道路名称表有大约300万条记录,我使用以下Linq-to-SQL将其加载到内存中:
Dictionary<String, DbRoadName> roadNames;
using (RoutingDataContext dc = new RoutingDataContext(connectionString))
{
roadNames = dc.DbRoadNames.ToDictionary(x => x.RoadId);
}
这段代码执行得很好。在此处停止代码并将鼠标悬停在Visual Studio中的roadNames变量上,可以看到字典似乎包含了预期的键值对。
然而,在程序后面的以下行中:
DbRoadName roadName = roadNames[lookupId];
程序出现以下异常:
.Net SqlClient数据提供程序:超时。
据我了解,
ToDictionary()
方法应该在那一点上执行数据库查询,那么为什么在字典查找时会出现SQL超时错误?更新: 我通过替换
ToDictionary()
方法中的代码“修复”了问题。DbRoadName roadName = roadNames[lookupId];
使用TryGetValue语句。然而,我仍然对为什么内存中的字典会产生SQL异常感兴趣。
DbRoadNames
中的某些内容被延迟执行了。是的,调用ToDictionary
将强制执行以获取它们,但不会强制获取所有导航属性。正如Blam所问的那样,什么是DbRoadName?我们知道它是一个对象,并且是来自表格的一条记录,但它是否包含对其他对象的引用? - DrewJordan