我的应用程序的一部分使用道路名称,这些道路名称存储在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];

该程序停止,但出现以下异常



据我了解,ToDictionary()方法应该使数据库查询在那时执行,那么为什么在字典查找时出现SQL超时错误?

更新:
我通过替换来“解决”问题
DbRoadName roadName = roadNames[lookupId];

使用TryGetValue语句。但是,我仍然对为什么内存字典产生SQL异常感兴趣。

最佳答案

为了避免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);
}

这有帮助吗?

关于c# - 为什么我的字典查找会出现SQL超时错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29849914/

10-16 19:29
查看更多