为什么AsQueryable抛出StackOverflowException?

时间:2009-03-27 21:03:57

标签: linq

我从通用列表中调用LINQ扩展方法AsQueryable。我访问它时抛出StackOverflowException异常。这是NerdDinner asp.net mvc演示应用程序中使用的类似技术。我做错了什么?

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

3 个答案:

答案 0 :(得分:2)

Stack trace是你的朋友。该异常是来自AsQueryable还是来自您自己的类?

同时,请检查get { return users.AsQueryable(); }是否说get { return Users.AsQueryable(); }

答案 1 :(得分:1)

您在此处发布的代码运行正常。我猜你是真正的代码会做这样的事情。

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

注意Users.AsQueryable()中的用户大写。

答案 2 :(得分:1)

也许是一个错误。并在LINQ 4.0中得到纠正

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

  

查询稳定性包含现在检测到自引用IQueryable并且不会导致堆栈溢出

在.NET 3.5中解决问题:使用“自动生成值”= True时,必须将“延迟加载”设置为False - 否则会出现递归错误。