首页 > 解决方案 > EF Core 3.1 在查询时不使用帮助程序类进行翻译

问题描述

在 .NET Core 2.2 中,我曾经使用一个帮助类来解密数据库中的数据并检索用户信息,但现在我不能了。我得到一个例外,说它不能被翻译。

这与 .NET Core 2.2 中使用的逻辑相同

var cp = await Context.Company
                      .Where(a => Encrypt.Decry(a.Email, a.Em) == login.Email 
                                  && login.Password == Hash.get(a.Password))
                      .SingleOrDefaultAsync();

例外:

无法翻译 LINQ 表达式 'DbSet.Where(c => Encrypt.Decry(value: c.Email, sec: c.Em) == __login_Email_0 && __login_Password_1 == Hash.get(c.Password))'。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038。"}

我不明白为什么我应该明确使用AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()?

更新:所以我尝试通过添加来遵循该示例,AsEnumerable但它必须与 await 并且我收到错误where

 var cp = await Context.Company.AsAsyncEnumerable().Where(a => Encrypt.Decry(a.Email, a.Em) == login.Email && login.Password == Hash.get(a.Password)).SingleOrDefaultAsync();

标签: c#entity-framework-core

解决方案


EF Core 无法转换Encrypt.Decry为 SQL 查询。这就是您看到错误的原因。您可以将所有数据加载到内存中,然后执行Encrypt.Decry.

来自https://docs.microsoft.com/en-us/ef/core/querying/client-eval

在 3.0 版之前,Entity Framework Core 支持在查询中的任何位置进行客户端评估。有关详细信息,请参阅以前的版本部分。

很可能现在它是这样实现的,以避免无意的客户端评估,其中大量数据可以加载到内存中。现在您应该显式配置客户端评估。


推荐阅读