Entity framework 错误:查询结果不能枚举多次

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)

以以下代码调用EF 4.0中的SP:

  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的行有什么关系?