2009-03-27 2 views
0

私は、LINQ拡張メソッドAsQueryableを汎用リストから呼び出しています。私はそれにアクセスするとStackOverflowException例外がスローされます。これは、NerdDinnerのasp.net mvcデモアプリケーションで使用されている同様の手法です。私は間違って何をしていますか?なぜAsQueryableはStackOverflowExceptionをスローしますか?

class FakeUserRepository : IUserRepository 
    { 
     List<User> users = new List<User>(); 

     public FakeUserRepository() { 
      users.Add(new User() { 
       UserID = new Guid("2C3028AC-B51C-4AA6-8E19-AF962AC07EE7"), 
       DisplayName = "User1" 
      }); 

      users.Add(new User() { 
       UserID = new Guid("EBA48956-2BFE-4C03-8D1B-29747FA7DB25"), 
       DisplayName = "User2" 
      }); 
     } 

     public IQueryable<User> Users { 
      get { return users.AsQueryable(); } 
     } 
    } 

    public interface IUserRepository 
    { 
     IQueryable<User> Users { get; } 
    } 

public class MyController : Controller 
{ 
    IUserRepository _userRepository; 

    public MyController(IUserRepository userRepository) { 
     _userRepository = userRepository; 
    } 

    protected override void Execute(System.Web.Routing.RequestContext requestContext) { 
     Guid userID = new Guid("2C3028AC-B51C-4AA6-8E19-AF962AC07EE7"); 

     if (requestContext.HttpContext.Request.IsAuthenticated) { 
      var query = (from u in _userRepository.Users 
         where u.UserID == userID 
         select new { 
          u.DisplayName 
         }).FirstOrDefault(); 

      ViewData["displayName"] = query.DisplayName; 
     } 

     base.Execute(requestContext); 
    } 
} 
+0

getter(Users)がそのコードで使用されているとは限りません。クラス変数のみです。 –

+0

AsQueryable()が呼び出されたとき、または結果のオブジェクトに対してクエリが実行されたときにスローされますか? –

+0

コードを編集してその使用方法を示しました。 – user82334

答えて

2

スタックトレースはあなたの友人です。例外はAsQueryableまたはあなたのクラスから来ますか?平均時間で

は、get { return users.AsQueryable(); }はあなたがここに掲載get { return Users.AsQueryable(); }

1

コードが正常に動作言っていないことを確認してください。私はあなたが本当のコードがこのようなことをしていると思います。

public IQueryable<User> Users 
{ 
    get { return Users.AsQueryable(); } 
} 

Users.AsQueryable()でのユーザーの大文字に注意してください。

1

多分バグです。そして、4.0

http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

クエリの安定性が、今入って自己参照のIQueryableを検出し、問題を解決するために、.NET 3.5では、スタックオーバーフローに

を起こさないLINQで修正されました:とき'Auto Generated Value' = Trueを使用すると、 'Delay Loaded'をFalseに設定する必要があります。そうしないと、再帰エラーが発生します。

関連する問題