2010-07-20 55 views
1

呼叫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循環:

「查詢的結果不能不止一次枚舉。「} System.SystemException {System.InvalidOperationException}

它似乎一段時間工作正常。不要承認爲什麼。

回答

4

從方法中返回IQueryable僅當您希望在執行之前向查詢添加某些內容(過濾器,投影,連接...)時纔有用。但是,因爲你的方法列舉的結果與foreach,查詢已當你回吧,所以來不及添加任何東西給它執行......

也許你的方法應該返回一個IEnumerable<Employee>代替:

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

BTW,EF 4.0處理相關實體的延遲加載,所以你通常沒有。如果你沒有真正使用的IQueryable接口來調用Load明確

+0

你是對的,如果使用ObjectSet,則不需要明確加載引用來調用Load(),Include將執行該作業。但是,當您可以存儲過程並將結果映射到EntitySet(ResultSet)時,您需要明確加載引用。會嘗試。奇怪的是:代碼在第一次完成時工作正常,但後來出現以上錯誤。真的很困惑。謝謝。 – KentZhou 2010-07-21 01:18:19

+0

已嘗試上面的代碼,將IQuerable更改爲IEnumerable,仍然會得到相同的錯誤消息:查詢的結果不能枚舉多次。 – KentZhou 2010-07-21 13:44:17

+0

在foreach循環中發生錯誤。相關方法的返回值如何爲該foreach提供任何線索? – 2010-08-29 13:24:20

3

,簡單的解決辦法是CAL .ToList()與工作10或List返回類型。

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

在foreach循環,儘量results.ToList() 有趣,但對我來說工作轉換。

相關問題