首页 > 解决方案 > 无法使用 Linq、EF Core、Npgsql、Postgres 过滤服务器上的数据

问题描述

我试图用谷歌搜索解决方案,并阅读了文档。因此,我无法以这种方式过滤我的实体:

// 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);

我收到以下异常:

无法翻译 LINQ 表达式“DbSet .Where(p => p.UserLogin.ToLower() == __ToLower_0)”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

用户列表可能非常大,因此在强制客户端过滤ToList()之前无法调用此选项。Where()相反,我需要 EF 使用 WHERE 构建查询,并将仅过滤后的值返回给客户端。

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

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

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

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

标签: linqentity-framework-corenpgsql

解决方案


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


推荐阅读