C# FirstOrDefault()抛出未设置为对象错误实例的对象引用
我有以下代码行:C# FirstOrDefault()抛出未设置为对象错误实例的对象引用,c#,linq,entity-framework,C#,Linq,Entity Framework,我有以下代码行: var y = userRep.All.FirstOrDefault(x => x.UserName == userName); userRep是一个存储库类,All方法定义为 public IQueryable<User> All { get { return _context.Users; } } public IQueryable All { 获取{return\u context.Users;} } 用户名被传递到函数中,使用调试器我可以
var y = userRep.All.FirstOrDefault(x => x.UserName == userName);
userRep是一个存储库类,All方法定义为
public IQueryable<User> All
{
get { return _context.Users; }
}
public IQueryable All
{
获取{return\u context.Users;}
}
用户名被传递到函数中,使用调试器我可以验证它是否有值。每当我运行该行代码时,都会出现一个错误:
对象引用未设置为对象错误的实例
如果我将条件硬编码为
x.UserName==“abc”
,它可以正常工作,但我不确定当调试器显示UserName中有值时,为什么它一直认为UserName为null。您的这行代码是正确的:
var y = userRep.All.FirstOrDefault(x => x.UserName == userName);
如果假设第二个用户名为null,即使在这种情况下,它也不会抛出异常,但如果查询返回null意味着找不到任何记录,则y
将为null,当您访问它或对它进行迭代时,它将通过异常
如果您没有实例化userRep
,它将抛出异常
这样做,在查询数据库之前,假设您的dbcontext类名MyDbContext
var userRep = new MyDbContext();
在没有更多细节的情况下,并且想当然地认为前面提出的任何答案都不能解决您的问题,我可以想到另一个可能的原因:“userName”变量(或您的示例中未显示的其他外部变量)正在被“捕获”,最终,某些东西正在改变其值。比如说
var y = userRep.All.FirstOrDefault(x => x.UserName == userName);
...
userName = null;
...
foreach(var x in y){...}
在这里阅读更多关于这方面的信息我让它工作起来了,它与“一瞥”和“实体框架”有关,我发现了这个带有细节的链接:我不得不将“实体框架”降级到6.0.2,现在它可以工作了。你能把剩下的代码发布到定义了
用户名
的地方吗?username
的值是否与您硬编码的值完全相同?使用该硬编码用户名调用FirstOrDefault
是否返回User
对象?空引用异常是指您的y
变量,还是调用FirstOrDefault
时抛出的异常?x.UserName==“abc”
返回值还是为空?您能告诉我们如何初始化\u上下文
以及何时?x.UserName==“abc”返回空值,所以在该行y=null之后,这很好,因为数据库中不存在该用户名。您可以发布异常的堆栈跟踪吗?