当我部署到生产服务器并在foreach中遍历位置时,我得到上述错误(主题行)。为了让它在生产服务器上工作,我必须转换为一个数组,即 var locationArray = locations.ToArray(); 并迭代 locationArray 。
所以我的问题是在TEST中(在VS2013中调试时运行本地)我正在针对SQLExpress实例运行而在PRODUCTION中我正在运行一个完全成熟的SQLServer。但是,为什么迭代位置不会在TEST中产生错误,但在PRODUCTION中会这样做?
public IQueryable<State> StatesInCountryGet(long aCountryId)
{
List<State> result = new List<State>();
using (DataRepository dataRepository = DataRepository.Instance())
{
//#TODO: Find a better way to do a GROUP BY
IQueryable<LocationsMapping> locations = dataRepository.Query<LocationsMapping>(r => r.CountryId == aCountryId);
var locationArray = locations.ToArray(); //Why do I need to do this?
foreach (LocationsMapping locationMapping in locationArray)
{
//Add the state if we don't have it already
if (!result.Exists(r => r.Id == locationMapping.StateId))
{
result.Add(locationMapping.State);
}
}
}
return result.AsQueryable();
}
答案 0 :(得分:2)
不同的数据库版本具有不同的功能,ORM等工具通常会将其代码定制到特定平台以利用功能差异。因此,测试一个非常不同的版本是一个真的坏主意。我强烈建议您针对开发人员版本进行开发。
调用ToArray()
会强制立即完全评估迭代(到序列的末尾)。这实际上是一个非常常见的事情,可以避免在一个连接上同时使用读者。
至于为什么:也许你在一个而不是另一个上启用Multiple Active Result Sets(MARS);或者它可能知道MARS在快递上永远不会,所以不要尝试 - 但它认为MARS 可能在完整的SQL Server上可用,所以尝试使用它