C# sqlite实体框架核心中的奇怪行为
我有一个简单的C# sqlite实体框架核心中的奇怪行为,c#,sqlite,entity-framework-core,asp.net-core-webapi,C#,Sqlite,Entity Framework Core,Asp.net Core Webapi,我有一个简单的DbContext和一组用户 我有一个带有身份验证的ASP.NET核心Web API public User Authenticate(string username, string password) { var user = _ctx.Users.FirstOrDefault(x => x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) &&
DbContext
和一组用户
我有一个带有身份验证的ASP.NET核心Web API
public User Authenticate(string username, string password)
{
var user = _ctx.Users.FirstOrDefault(x =>
x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) &&
x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));
bool exists = _ctx.Users.Any(x =>
x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) &&
x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));
bool usernameCorrect = _ctx.Users.First().Username.Equals(username, StringComparison.OrdinalIgnoreCase);
bool passwordCorrect = _ctx.Users.First().Password.Equals(password, StringComparison.OrdinalIgnoreCase);
if (user == null)
{
return null;
}
[...]
}
问题是\u ctx.Users.FirstOrDefault
返回null
您可能认为这很简单:“条件不匹配”
但是:
这里发生了什么?发生的事情是,与OrdinalingOrecase的比较仅适用于物化对象。(您的IQueryable提供程序不支持它)。
它在第三种和第四种情况下工作,因为您首先实现了对象
尝试改用string.Compare(string str1、string str2、StringComparison.OrdinalIgnoreCase)==0
这不起作用;(entityframework说它无法翻译,我得到了一个异常。但我明白了重点。\u ctx.Users.SingleOrDefault(x=>x.Username.Equals(Username)和&x.Password.ToLower().Equals(Password.ToLower())
很好!StringComparison.OrdinalingOreCase通常是比较用户名和密码的一种不好的做法,但是如果你真的需要它,那么你可以将字符串转换成小写,并使用normal==来比较字符串作为解决方法。我现在正在使用md5哈希。我想降低它们是可以的:P