FirstOrDefault()抛出未将对象引用设置为对象错误的实例

时间:2014-04-09 16:05:37

标签: c# linq entity-framework

我有以下代码行:

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);

userRep是一个存储库类,All方法定义为

public IQueryable<User> All
{
    get { return _context.Users; }
}

userName传递给函数,使用调试器我可以验证它是否有值。每当我运行该行代码时,我都会收到错误:

  

对象引用未设置为对象错误的实例。

如果我将条件硬编码到x.UserName == "abc"它工作正常,但我不确定为什么当调试器显示其中有值时,它一直认为userName为null。

3 个答案:

答案 0 :(得分:0)

你的这行代码是对的:

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);

如果假设第二个userName为null,即使在这种情况下它也不会抛出异常,但如果查询返回null意味着没有找到记录,那么y将为null并且当你将访问它或迭代它。

如果您没有实例化userRep,它将抛出异常。

这样做,在查询数据库之前,保留你的dbcontext类名MyDbContext

var userRep = new MyDbContext();

答案 1 :(得分:0)

如果没有更多详细信息,并且理所当然地认为之前提出的任何答案都没有解决您的问题,我可以想到另一个可能的原因:&#34; userName&#34;变量(或您的示例中未显示的其他外部变量)正在被捕获&#34;并且,最终,某些东西正在改变它的价值。例如

var y = userRep.All.FirstOrDefault(x => x.UserName == userName);
...
userName = null;
...
foreach(var x in y){...}

在此处了解详情http://blogs.msdn.com/b/matt/archive/2008/03/01/understanding-variable-capturing-in-c.aspx

答案 2 :(得分:0)

我得到了它,它与Glimpse和Entity Framework有关,我发现这个链接有详细信息:https://github.com/Glimpse/Glimpse/issues/766我必须将Entity Framework降级到6.0.2并且它现在可以正常工作。