使用EF Core 3.1

时间:2020-06-29 06:56:51

标签: c# sql-server .net-core ef-core-3.1

在具有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万多用户,并且我不想在客户端过滤数据。

所提到的代码只是一个示例,但我的意思是其他使用情况更复杂的用例。

现在,如何使用复杂的功能在服务器端过滤数据?

2 个答案:

答案 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(); 

以表演为代价...

相关问题