Ste*_*ird 6 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)
这按预期执行.此时停止代码并将鼠标放在Visual Studio中的roadNames变量上会显示该字典似乎包含预期的键值对.
但是,当我稍后在程序中到达以下行时
DbRoadName roadName = roadNames[lookupId];
Run Code Online (Sandbox Code Playgroud)
程序因以下异常而停止
.Net SqlClient数据提供程序:超时已过期.
据我了解,该ToDictionary()方法应该导致数据库查询在那时执行,那么为什么我在字典查找中得到SQL超时错误?
更新: 我通过替换"修复"了问题
DbRoadName roadName = roadNames[lookupId];
Run Code Online (Sandbox Code Playgroud)
使用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);
}
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |