我从通用列表中调用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);
}
}
答案 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 - 否则会出现递归错误。