渲染视图时foreach上的奇数nullreference错误

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

猜猜你的生活,编码和学习!

Mik*_*son 6

是的,它与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.但没有更多的信息很难说.


RPM*_*984 5

改变这一行:

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>因此您的模型绑定不需要更改.


Lun*_*ore 1

检查您在用户中设置的UserGroupMain和是否不为空:Branch

                   UserGroupName = u.UserGroupMain.GroupName,
                   BranchName = u.Branch.BranchName,
Run Code Online (Sandbox Code Playgroud)

如果这解决了您的问题,Mikael 的答案解释了为什么它发生在那里,而不是在查询中进一步发生。