C# 为什么我的字典查找会出现SQL超时错误?

C# 为什么我的字典查找会出现SQL超时错误?,c#,.net,linq-to-sql,C#,.net,Linq To Sql,我的部分应用程序使用存储在SQL数据库中的道路名称。应用程序将至少访问每个名称记录一次,大多数将被多次访问。因此,我决定将名称数据加载到字典中,然后根据字典进行查找,以减少数据库读取 road names表有大约300万条记录,我使用以下Linq to SQL将其加载到内存中 Dictionary<String, DbRoadName> roadNames; using (RoutingDataContext dc = new RoutingDataContext(connecti

我的部分应用程序使用存储在SQL数据库中的道路名称。应用程序将至少访问每个名称记录一次,大多数将被多次访问。因此,我决定将名称数据加载到字典中,然后根据字典进行查找,以减少数据库读取

road names表有大约300万条记录,我使用以下Linq to SQL将其加载到内存中

Dictionary<String, DbRoadName> roadNames;

using (RoutingDataContext dc = new RoutingDataContext(connectionString))
{
    roadNames = dc.DbRoadNames.ToDictionary(x => x.RoadId);
}
程序停止时出现以下异常

.Net SqlClient数据提供程序:超时已过期

据我所知,
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);
}
字典roadnamemodel字典;
使用(RoutingDataContext dc=new RoutingDataContext(connectionString))
{
roadNames=dc.DbRoadNames
.Select(roadName=>newdbroadnamemodel(roadName.RoadId、roadName.Prop1、roadName.Prop2))
.ToDictionary(x=>x.RoadId);
}

这有帮助吗?

完整的异常详细信息(或至少比消息更详细的信息)可以帮助Wow放置一个roadNames。使用后立即计数。我猜是延期执行。@bum是我干的。计数显示了正确的值,但查找时仍会发生异常。请检查DbRoadName属性和构造函数。如果某个地方缺少一个值,那么如果数据库没有返回数据,您可能会编写一个get来单独获取数据,在这一点上,这可能是一个特定的数据错误。几乎可以肯定的是,对于
DbRoadNames
中的某些内容,延迟执行。是的,调用
ToDictionary
将强制执行以获取它们,但不会强制获取所有导航属性。正如布拉姆所问,DbRoadName是什么?据了解,它是一个对象,是表中的一条记录,但它是否包含对其他对象的引用?我做了非常类似的事情,使用一个非常简单的新poco对象保存字典中的数据。令我惊讶的是,即使字典没有包含任何数据库对象,我仍然在访问字典时得到SQL超时。你试过Steffenn Winkler或Flaudre的建议吗?从using语句中的字典访问元素。也许usr是对的,但例外是错误引导。
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);
}