我的部分应用程序使用存储在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超时错误?
更新 我通过替换
来解决问题DbRoadName roadName = roadNames[lookupId];
使用TryGetValue语句。但是,我仍然对内存中的字典产生SQL异常的原因感兴趣。
答案 0 :(得分:1)
为了避免SQL超时,我不会在我的字典中加载存储模型。而是将数据加载为具有必要属性的模型,如下所示:
Dictionary<String, DbRoadNameModel> roadNameModelDictionary;
using (RoutingDataContext dc = new RoutingDataContext(connectionString))
{
roadNames = dc.DbRoadNames
.Select(roadName => new DbRoadNameModel(roadName.RoadId, roadName.Prop1, roadName.Prop2))
.ToDictionary(x => x.RoadId);
}
这有帮助吗?