DbSet<User>.Where() 总是 return null EFCore2.2

DbSet<User>.Where() always return null EFCore2.2

我想使用 linq 从数据库中获取查询,但每次都 return 为空或为空;

var user = await _identityDb.Users.FirstOrDefaultAsync(u => u.UserName == user.UserName); // this return null but user exist even in debuger
var users = _identityDb.Users.Where(u => u.UserName == user.UserName); // this return empty

update 这个 return 用户

var users = _identityDb.Users.Where(u => u.UserName == u.UserName.ToString());

但是这个return是空的

var users = _identityDb.Users.Where(u => u.UserName == user.UserName.ToString());

==区分大小写。

如果你想比较两个不区分大小写的字符串,你应该使用接受 StringComparison:

String.Equals 的重载
var users = _identityDb.Users
                .Where(u => u.UserName
                                .Equals(user.UserName, StringComparison.OrdinalIgnoreCase);

您可以了解有关 StringComparison 枚举 here 的更多信息。

问题是因为我使用了一些加密方法。所以 SQLServer 无法处理它。我刚刚删除了用户名列上的加密。

显然每个 User 都有一个 属性 UserName。唉,你忘了告诉我们 属性 的类型。由于标识符的名称以及您与字符串的比较,我假设 UserName 是一个字符串。

如果UserName已经是一个字符串,为什么还要比较UserName.ToString()

以下 returns 用户 DbSet 中值为 UserName,等于 UserName.ToString 的所有用户:

var users = _identityDb.Users.Where(u => u.UserName == u.UserName.ToString());

因为 UserName 是一个字符串,所以 UserName.ToString() 总是等于 UserName。在这种情况下,查询将 return all Users.

现在您的 object user 似乎是 class User。我们不知道这个 user 是否是您 _identityDb.Users 的 collection 中的 User

以下 return _identityDb.Users 中用户名等于 user.UserName

的所有用户
var users = _identityDb.Users.Where(u => u.UserName == user.UserName);

如果 user_identityDb.Users 中,您肯定会找到至少一个 User 具有此名称,甚至可能不止一个。如果仍然找不到,请尝试通过键入用户名进行调试:

string userName = user.UserName;
var users = _identityDb.Users.Where(u => u.UserName == userName);

最后一种可能性:可能 UserName 不是字符串,或者您定义了自己的 ToString()。如果您忽略了这些信息,那么我的建议是花一些时间学习如何正确提问。