2009-03-27 5 views
0

J'appelle la méthode d'extension LINQ AsQueryable d'une liste générique. Il renvoie l'exception StackOverflowException lorsque j'y accède. C'est une technique similaire utilisée dans l'application de démonstration NerdDinner asp.net mvc. Qu'est-ce que je fais mal?Pourquoi AsQueryable lance-t-il une exception 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

Je ne vois pas le getter (Users) utilisé dans ce code, seulement la variable de classe. –

+0

Lance-t-il lorsque AsQueryable() est appelé ou lorsque des requêtes sont effectuées sur l'objet résultant? –

+0

J'ai modifié le code pour montrer comment il est utilisé. – user82334

Répondre

2

Stack trace est votre ami. Est-ce que l'exception provient d'AsQueryable ou de votre propre classe?

Dans le même temps, vérifiez que get { return users.AsQueryable(); } ne dit pas get { return Users.AsQueryable(); }

1

Le code affiché fonctionne ici bien. Je vais deviner que vous êtes un vrai code fait quelque chose comme ça.

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

Notez la casse des utilisateurs dans Users.AsQueryable().

1

Peut-être que c'est un bug. Et a été corrigé dans LINQ 4,0

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

la stabilité de la requête contient détecte maintenant IQueryable auto-référencement et ne provoque pas un débordement de pile

Dans .NET 3.5 pour résoudre le problème: Quand en utilisant 'Auto Generated Value' = True, vous devez définir 'Delay Loaded' sur False - sinon vous obtenez l'erreur de récursivité.

Questions connexes