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之后,这很好,因为数据库中不存在该用户名。您可以发布异常的堆栈跟踪吗?