无法使用 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) 调用中的简单属性或字段外,应该没有任何其他内容。
我尝试 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) 调用中的简单属性或字段外,应该没有任何其他内容。