在具有SQL Server数据库的Web应用程序中,我已经使用“存储库模式”实现了数据访问层。为了根据其电子邮件过滤User
,我使用了这样的表达式:
var emailFilter = "user@example.com";
var query = _dbContext.Set<User>().Where(x => x.Email.Normalize() == emailFilter.Normalize());
var result = query.ToListAsync();
但是EF Core抛出一个异常:
...无法翻译。以一种可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估
我的用户表中有20万多用户,并且我不想在客户端过滤数据。
所提到的代码只是一个示例,但我的意思是其他使用情况更复杂的用例。
现在,如何使用复杂的功能在服务器端过滤数据?
答案 0 :(得分:0)
我建议您,首先通过批量更新在db中标准化您的电子邮件:
由Z.EntityFramework.Plus.EFCore
_dbContext.Set<User>().update(x => new User {Email = x.Email.Normalize()} ;
然后
emailFilter = ("user@example.com").Normalize();
var query = _dbContext.Set<User>().Where(x => x.Email == emailFilter);
var result = query.ToListAsync();
这是一个实例解决方案
答案 1 :(得分:0)
对于非标准,请使用普通的SQL查询...
var emailFilter = "user@example.com";
var result = await _dbContext.Users.FromSqlRaw($"SELECT * FROM dbo.Users WHERE LOWER(Email) = {emailFilter}").ToListAsync();
或使用功能
var emailFilter = "user@example.com";
var result = await _dbContext.Users.Where(x => EF.Functions.Like(x.Email, $"%{emailFilter}%")).ToListAsync();
以表演为代价...