Entity framework 错误:查询结果不能枚举多次
以以下代码调用EF 4.0中的SP:Entity framework 错误:查询结果不能枚举多次,entity-framework,domainservices,Entity Framework,Domainservices,以以下代码调用EF 4.0中的SP: public IQueryable<Employee> GetEmployeesByFollowup() { var results = from p in this.ObjectContext.SearchEmployeeFollowup() select p; foreach (Employee p in results)
public IQueryable<Employee> GetEmployeesByFollowup()
{
var results = from p in this.ObjectContext.SearchEmployeeFollowup()
select p;
foreach (Employee p in results)
{
p.DepaermentReference.Load();
}
return results.AsQueryable<Employee>();
}
public IQueryable GetEmployeesByFollowup()
{
var results=this.ObjectContext.SearchEmployeeFollowup()中的p
选择p;
foreach(结果中的员工p)
{
p、 DepaermentReference.Load();
}
返回结果。AsQueryable();
}
在For循环中导致以下错误:
“查询结果不能枚举多次。”}System.SystemException{System.InvalidOperationException}
它似乎在一段时间内运行良好。不要理解原因。只有在执行查询之前,要向查询中添加内容(筛选、投影、联接…)时,从方法返回
IQueryable
才有用。但是,由于您的方法使用foreach
枚举结果,因此在返回查询时已经执行了查询,因此现在添加任何内容都为时已晚
也许您的方法应该返回一个IEnumerable
:
public IEnumerable<Employee> GetEmployeesByFollowup()
{
var results = this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach (Employee p in results)
{
p.DepaermentReference.Load();
}
return results;
}
public IEnumerable GetEmployeesByFollowup()
{
var results=this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach(结果中的员工p)
{
p、 DepaermentReference.Load();
}
返回结果;
}
顺便说一句,EF 4.0处理相关实体的延迟加载,因此通常不必显式调用
Load
,从方法返回IQueryable
,只有在执行查询之前要向查询添加某些内容(筛选、投影、连接…)时才有用。但是,由于您的方法使用foreach
枚举结果,因此在返回查询时已经执行了查询,因此现在添加任何内容都为时已晚
也许您的方法应该返回一个IEnumerable
:
public IEnumerable<Employee> GetEmployeesByFollowup()
{
var results = this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach (Employee p in results)
{
p.DepaermentReference.Load();
}
return results;
}
public IEnumerable GetEmployeesByFollowup()
{
var results=this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach(结果中的员工p)
{
p、 DepaermentReference.Load();
}
返回结果;
}
顺便说一句,EF4.0处理相关实体的延迟加载,因此通常不必显式调用
Load
,如果您不是真正使用IQueryable接口,简单的解决方案是使用cal.ToList()
并使用IEnumerable
或List
返回类型。如果您不是真正使用IQueryable接口,简单的解决方案是调用.ToList()
并使用IEnumerable
或List
返回类型。公共IEnumerable GetEmployeesByFollowup()
public IEnumerable<Employee> GetEmployeesByFollowup()
{
var results = this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach (Employee p in results.ToList())
{
p.DepaermentReference.Load();
}
return (IEnumerable<Employee>)results;
}
{
var results=this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach(results.ToList()中的员工p)
{
p、 DepaermentReference.Load();
}
返回(IEnumerable)结果;
}
在foreach循环中,尝试转换结果。ToList()
有趣,但在我的情况下是可行的。public IEnumerable GetEmployeesByFollowup()
{
var results=this.ObjectContext.SearchEmployeeFollowup().ToList();
foreach(results.ToList()中的员工p)
{
p、 DepaermentReference.Load();
}
返回(IEnumerable)结果;
}
在foreach循环中,尝试转换结果。ToList()
有趣的是,但在我的情况下是可行的。您是对的,如果使用ObjectSet,则无需显式加载引用来调用load(),Include将完成这项工作。但当您可以将存储过程和结果映射到EntitySet(ResultSet)时,您需要显式地加载引用。我会努力的。奇怪的是:代码在第一次完成时运行良好,但后来出现上述错误。真的很困惑。谢谢。请尝试上面的代码,将IQuerable更改为IEnumerable,仍然会收到相同的错误消息:查询结果不能多次枚举。错误发生在foreach循环中。所讨论的方法的返回值与foreach的行有什么关系?您是对的,如果使用ObjectSet,则无需显式加载引用来调用load(),Include将完成此任务。但当您可以将存储过程和结果映射到EntitySet(ResultSet)时,您需要显式地加载引用。我会努力的。奇怪的是:代码在第一次完成时运行良好,但后来出现上述错误。真的很困惑。谢谢。请尝试上面的代码,将IQuerable更改为IEnumerable,仍然会收到相同的错误消息:查询结果不能多次枚举。错误发生在foreach循环中。该方法的返回值与foreach的行有什么关系?