为什么我的字典查找会产生SQL超时错误?

时间:2015-04-24 14:19:40

标签: c# .net linq-to-sql

我的部分应用程序使用存储在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异常的原因感兴趣。

1 个答案:

答案 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);
}

这有帮助吗?