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