Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 实体框架-System.IndexOutOfRangeException_Linq_Entity Framework_C# 4.0_Caching_Enterprise Library - Fatal编程技术网

Linq 实体框架-System.IndexOutOfRangeException

Linq 实体框架-System.IndexOutOfRangeException,linq,entity-framework,c#-4.0,caching,enterprise-library,Linq,Entity Framework,C# 4.0,Caching,Enterprise Library,我正在使用EntityFramework4.1来查询SQLServer2008数据库。不幸的是,我们经常会遇到以下例外情况: <ExceptionType>System.IndexOutOfRangeException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> <Message>Index was outside

我正在使用EntityFramework4.1来查询SQLServer2008数据库。不幸的是,我们经常会遇到以下例外情况:

<ExceptionType>System.IndexOutOfRangeException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
  <Message>Index was outside the bounds of the array.</Message>



at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
   at System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
   at System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
   at System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32 ordinal, String propertyName, String typeName)
   at lambda_method(Closure , Shaper )
   at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
   at lambda_method(Closure , Shaper )
   at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
   at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
   at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
   at System.Linq.Queryable.First[TSource](IQueryable`1 source)
   at OnlineSelfService.Business.ContentServiceBusiness.GetPageContent(Int32 pageId)</StackTrace>
System.indexootfrangeexception,mscorlib,版本=4.0.0.0,区域性=neutral,PublicKeyToken=b77a5c561934e089
索引超出了数组的边界。
位于System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
位于System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
位于System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader,Int32序号)
位于System.Data.Common.Internal.Materialization.Shaper.GetPropertyValueWithErrorHandling[TProperty](Int32序数,字符串propertyName,字符串typeName)
lambda_法(闭合、整形器)
位于System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 ConstructionEntityDelegate,EntityKey EntityKey,EntitySet EntitySet)
lambda_法(闭合、整形器)
在System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(整形器整形器整形器)
位于System.Data.Common.Internal.Materialization.Shaper`1.SimpleNumerator.MoveNext()
在System.Linq.Enumerable.First[TSource](IEnumerable`1 source)处
在System.Linq.Queryable.First[TSource](IQueryable`1 source)处
在OnlineSelfService.Business.ContentServiceBusiness.GetPageContent(Int32 pageId)
实际示例代码:

//Caller
  public EmployeeEntity GetEmployeeDetail(int employeeID)
    {
         IQueryable<Employee> result=null;
         if (myCaching.Contains("Employee"))
            {
                result = (IQueryable<Employee>)myCaching["Employee"];
            }
            else
            {
                result = dataAccess.GetEmployeeDetail();
                myCaching.AddToCache("Employee", result); //Expire in 2min
            }

            IQueryable<Employee> entityResult = from entity in result
                                                         where entity.employeeId == employeeID
                                                         select entity;
       if (entityResult.Count<Employee>() > 0)
                return entityResult.First<Employee>();
            return new EmployeeEntity();
   }
//调用者
公共EmployeeEntity GetEmployeeDetail(int employeeID)
{
IQueryable结果=null;
if(myCaching.Contains(“员工”))
{
结果=(IQueryable)myCaching[“Employee”];
}
其他的
{
结果=dataAccess.GetEmployeeDetail();
myCaching.AddToCache(“Employee”,result);//2分钟后过期
}
IQueryable entityResult=来自结果中的实体
其中entity.employeeId==employeeId
选择实体;
如果(entityResult.Count()>0)
返回entityResult.First();
返回新的EmployeeEntity();
}
}

//DAL
公共IQueryable GetEmployeeDetail()
{
DatabaseEntities ent=新的DatabaseEntities(此.\u连接字符串);
IQueryable结果=来自ent.EmployeeEntity中的员工
选择员工;
返回结果;
}
更新** 用缓存更新了我的代码

我用谷歌搜索寻找答案,但找不到确切的答案——根本原因。面对这一问题的一些人是否可以分享一个解决方案

谢谢。

调用.Count()执行查询。我不认为.First()会再次执行它,但可能是这样,而且在这些调用之间发生了一些变化。您可以尝试将查询重写为:

(from entity in result
where entity.employeeId == employeeID
select entity).FirstOrDefault() ?? new EmployeeEntity();
调用.Count()执行查询。我不认为.First()会再次执行它,但可能是这样,而且在这些调用之间发生了一些变化。您可以尝试将查询重写为:

(from entity in result
where entity.employeeId == employeeID
select entity).FirstOrDefault() ?? new EmployeeEntity();

试着像这样返回:

return entityResult.First(e => e.employeeId == employeeID);

试着像这样返回:

return entityResult.First(e => e.employeeId == employeeID);

在IEnumerable或IQueryable上调用的任何函数都将重新执行查询。。。这就是为什么把这样的东西放在循环中是不好的。您最终会向数据库发出多达吨的查询。至于它为什么会得到异常,我将使用.Any()而不是count来确定结果的长度

return (entityResult.Any<Employee>() > 0) ? entityResult.First<Employee>() : new EmployeeEntity();
return(entityResult.Any()>0)?entityResult.First():新员工实体();
尽管逻辑有点混乱,因为您希望返回单个EmployeeEntity,而查询表明您只希望返回一个。所以你可以用

entityResult.Single<Employee>() 
entityResult.Single()
如果返回多个异常,将抛出异常,除非您无法处理调用方中的异常。然后SingleOrDefault可能是最好的,然后只检查null,而不进行计数或任何检查


只是一些建议做某事总是有多种方法

在IEnumerable或IQueryable上调用的任何函数都将重新执行查询。。。这就是为什么把这样的东西放在循环中是不好的。您最终会向数据库发出多达吨的查询。至于它为什么会得到异常,我将使用.Any()而不是count来确定结果的长度

return (entityResult.Any<Employee>() > 0) ? entityResult.First<Employee>() : new EmployeeEntity();
return(entityResult.Any()>0)?entityResult.First():新员工实体();
尽管逻辑有点混乱,因为您希望返回单个EmployeeEntity,而查询表明您只希望返回一个。所以你可以用

entityResult.Single<Employee>() 
entityResult.Single()
如果返回多个异常,将抛出异常,除非您无法处理调用方中的异常。然后SingleOrDefault可能是最好的,然后只检查null,而不进行计数或任何检查


只是一些建议做某事总是有多种方法

您的上下文是否与数据库不同步?(数据库列与类属性不匹配?)问题只是随机发生的,我不怀疑这是一个同步问题。相关:您提供的链接没有将答案标记为已接受。没有,但由于异常和情况非常相似,因此交叉链接问题很有用。您的上下文是否与数据库不同步?(数据库列不匹配类属性?)。这可能是原因吗?@dskh Nice catch,它正在重新执行查询,count不获取数据,它只执行SQL计数,FirstOrDefault看起来是正确的解决方案here@Guillaume86,谢谢你的回答。什么是count不获取数据的原因?我已经更新了co