1

次のコードで 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>();
        }

For ループで発生した次のエラー:

「クエリの結果を複数回列挙することはできません。」} System.SystemException {System.InvalidOperationException}

しばらくはうまくいっているようです。理由がわかりません。

4

3 に答える 3

4

メソッドから を返すことIQueryableは、クエリを実行する前にクエリ (フィルター、射影、結合など) に何かを追加したい場合にのみ役立ちます。しかし、あなたのメソッドは で結果を列挙するためforeach、クエリは返された時点ですでに実行されているため、何かを追加するには遅すぎます...

おそらく、メソッドはIEnumerable<Employee>代わりにa を返す必要があります。

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

Loadところで、EF 4.0 は関連するエンティティの遅延読み込みを処理するため、通常は明示的に呼び出す必要はありません

于 2010-07-20T21:54:29.047 に答える
3

IQueryable インターフェイスを実際に使用していない場合、簡単な解決策は、型を調整して操作.ToList()するIEnumerableか、List型を返すことです。

于 2011-09-10T05:06:57.303 に答える
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() を面白いものに変換しようとしましたが、私の場合はうまくいきました。

于 2011-12-14T06:25:13.900 に答える