Ошибка: результат запроса не может быть перечислен более одного раза - PullRequest
1 голос
/ 21 июля 2010

Вызовите SP в EF 4.0 в следующем коде:

  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>();
        }

Следующая ошибка, вызванная в цикле For:

"Результат запроса не может быть перечислен более одного раза."} Система.SystemException {System.InvalidOperationException}

Кажется, какое-то время работает нормально.Не понимаю, почему.

Ответы [ 3 ]

4 голосов
/ 21 июля 2010

Возвращение IQueryable из метода полезно только в том случае, если вы хотите добавить что-либо к запросу (фильтр, проекция, объединение ...) до его выполнения. Но поскольку ваш метод перечисляет результаты с foreach, запрос уже был выполнен, когда вы его возвращаете, поэтому уже слишком поздно что-либо добавлять к нему ...

Возможно, ваш метод должен вернуть IEnumerable<Employee> вместо:

    public IEnumerable<Employee> GetEmployeesByFollowup()
    {
        var results = this.ObjectContext.SearchEmployeeFollowup().ToList();
        foreach (Employee p in results)
        {
            p.DepaermentReference.Load();
        }
        return results;
    }

Кстати, EF 4.0 обрабатывает отложенную загрузку связанных сущностей, поэтому обычно вам не нужно вызывать Load явно

3 голосов
/ 10 сентября 2011

Если вы на самом деле не используете интерфейс IQueryable, простым решением было бы вызвать .ToList() и работать с IEnumerable или List типом возврата.

1 голос
/ 14 декабря 2011
public IEnumerable<Employee> GetEmployeesByFollowup()
{
    var results = this.ObjectContext.SearchEmployeeFollowup().ToList();
    foreach (Employee p in results.ToList())
    {
        p.DepaermentReference.Load();
    }
    return (IEnumerable<Employee>)results;
}

в цикле foreach, попробуйте преобразовать результаты. ToList () забавно, но работает в моем случае.

...