gid*_*eon 7 c# asp.net-mvc linq-to-entities moq asp.net-mvc-3
这个错误是如此奇怪我只是无法弄清楚什么是真的错!
在UserController我有
public virtual ActionResult Index()
{
var usersmdl = from u in RepositoryFactory.GetUserRepo().GetAll()
select new UserViewModel
{
ID = u.ID,
UserName = u.Username,
UserGroupName = u.UserGroupMain.GroupName,
BranchName = u.Branch.BranchName,
Password = u.Password,
Ace = u.ACE,
CIF = u.CIF,
PF = u.PF
};
if (usersmdl != null)
{
return View(usersmdl.AsEnumerable());
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
我的观点属于@model IEnumerable<UserViewModel>顶部类型.
这是发生的事情:

究竟是什么和什么是空的!?
我使用moq从虚拟存储库创建用户.我还编写了单元测试,通过,以确保返回适量的模拟用户.
也许有人可以指出我在正确的方向?堆栈顶部的跟踪是:
at lambda_method(Closure , User )
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at ASP.Index_cshtml.Execute()
Run Code Online (Sandbox Code Playgroud)
这与linq有关吗?告诉我如果我应该包括完整的堆栈跟踪.
编辑
<BangsHeadOnWall />
哇,我不敢相信这是u.UserGroupMain.GroupName感谢@Lunivore.
这是一个模型仓库,我有一个单元测试来检查模拟repo用户是否有一个UserGroupMain 的模拟实例但是如果GroupName已经设置了wee属性我没有Assert !
谢谢@ RPM1984你建议得到代码在控制器本身中断.另外,我学到了新东西.
谢谢@Mikael,我第一次使用眼前的窗户很酷!= d
猜猜你的生活,编码和学习!
是的,它与linq有关.Linq在您使用它之前不会执行查询.因此,当您循环查询时,查询会运行,并且由于某种原因它会崩溃.
什么是GetAll返回?你可以做的一件事是在Index()中放置一个断点,当它断开时在立即窗口中写下它.
>RepositoryFactory.GetUserRepo().GetAll().ToList()
Run Code Online (Sandbox Code Playgroud)
如果找不到立即窗口,可以通过写入打开它
>immed
Run Code Online (Sandbox Code Playgroud)
在findbox中(在VS的顶部)
如果没有崩溃,那么问题可能在于index()中的linq.从我所看到的,我怀疑u.UserGroupMain或u.Branch为null.但没有更多的信息很难说.
改变这一行:
return View(usersmdl.AsEnumerable());
Run Code Online (Sandbox Code Playgroud)
对此:
return View(usersmdl.ToList());
Run Code Online (Sandbox Code Playgroud)
为什么?
来自MSDN:
AsEnumerable(Of TSource)(IEnumerable(Of TSource))方法除了将源的编译时类型从实现IEnumerable(Of T)的类型更改为IEnumerable(Of T)本身之外没有任何效果.
英文 - 因为.AsEnumerable()转换为IEnumerable<T>,但IQueryable<T> 已经实现IEnumerable<T>,因此查询没有实现 - 并且在枚举中的项目时在视图中被懒惰地评估foreach.LINQ延迟执行的经典技巧.
这就是为什么我喜欢Resharper - 它会告诉你这个AsEnumerable()电话是多余的 - 然后你的查询被推迟就会变得更加明显.
.ToList()将在查询到达View之前触发查询,并且仍然实现,IEnumerable<T>因此您的模型绑定不需要更改.
检查您在用户中设置的UserGroupMain和是否不为空:Branch
UserGroupName = u.UserGroupMain.GroupName,
BranchName = u.Branch.BranchName,
Run Code Online (Sandbox Code Playgroud)
如果这解决了您的问题,Mikael 的答案解释了为什么它发生在那里,而不是在查询中进一步发生。