无法使用 Linq、EF Core、Npgsql、Postgres 过滤服务器上的数据

Cannot filter data on server using Linq, EF Core, Npgsql, Postgres

我尝试 google 解决方案,并阅读了文档。 所以,我无法通过这种方式过滤我的实体:

// Raises the exception
MyUser myUser = _sqlContext.MyUsers
    .Where(user => user.UserLogin.ToLower() == userLogin.ToLower())
    .ToList()
    .FirstOrDefault();

// Raises the exception
MyUser myUser = _sqlContext.MyUsers
    .Where(user => user.UserLogin.ToLower() == userLogin.ToLower())
    .ToList()
    .FirstOrDefault();

// Raises the exception, too
MyUser myUser = _sqlContext.MyUsers
    .Where(user => user.UserLogin == userLogin)
    .FirstOrDefault();

// Raises the exception, too
MyUser myUser = _sqlContext.MyUsers
    .FirstOrDefault(user => user.UserLogin == userLogin);

我收到以下异常:

The LINQ expression 'DbSet .Where(p => p.UserLogin.ToLower() == __ToLower_0)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

用户列表可能非常大,因此无法选择在 Where() 之前调用 ToList() 来强制客户端过滤。相反,我需要 EF 来构建一个带有 WHERE 的查询,并且 return 只对客户端过滤的值。

我的应用程序使用 ASP.NET Core 3.1 以及 EF Core 3.1.5。如果我删除 ToLower(),它也不起作用。 我怎样才能使这项工作?

更新: 问题出在 user.UserLogin 的自定义 getter/setter 中。这是模型的一部分:

public class MyUser
{
    internal string _userLogin { get; set; }

    public string UserLogin
    {
        get => _userLogin;
        set => _userLogin = value.ToLower();
    }
}

我不得不删除自定义 getter 和 setter 以及 _userLogin 字段。因此,结论 - 除了 Where 或 First(OrDefault) 调用中的简单属性或字段外,应该没有任何其他内容。