为什么“无法翻译 LINQ 表达式 'x'”?我没有使用“Where()”

2024-04-06

当我执行以下代码时,出现错误:

System.InvalidOperationException:LINQ 表达式 'DbSet.Where(u => u.NormalizedEmail == __ToLower_0 && u.PasswordHash.SequenceEqual(__pass_1))' 无法翻译

但它在 .NET Core 2.2 中运行良好。 .NET Core 3.1 中引发错误。

loginCreds.Password = loginCreds.Password.ToLower();
var pass = Helper.ComputeHash(loginCreds.Password);
var usr = await _context.Users
                        .FirstOrDefaultAsync(u => u.NormalizedEmail == loginCreds.Email
                                                  && u.PasswordHash.SequenceEqual(pass));

但是,当我更换u.PasswordHash.SequenceEqual(pass) with u.PasswordHash == new byte[16](仅用于测试),它有效。所以,问题是SequenceEqual(byte[] byte) method.

我该如何解决这个问题?


在这里你或许能找到答案EF核心3.0 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/在“受限客户评价”中

例如,如果 EF Core 2.2 无法转换 a 中的谓词 Where() 调用,它执行了一条不带过滤器的 SQL 语句, 从数据库中传输所有行,然后过滤它们 在记忆中

....

在 EF Core 3.0 中,我们限制客户端评估仅发生在 顶层投影(本质上是对 Select() 的最后一次调用)。 当 EF Core 3.0 检测到无法在任何地方翻译的表达式时 否则在查询中,它会抛出运行时异常。

对于 EF Core 2.2,查询的部分为SequenceEqual实际上并不是用 SQL 完成的。

你应该尝试这样做:

var usr = await _context.Users
.Where(u => u.NormalizedEmail == loginCreds.Email)
.ToListAsync()
.FirstOrDefault(u => u.PasswordHash.SequenceEqual(pass));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“无法翻译 LINQ 表达式 'x'”?我没有使用“Where()” 的相关文章

随机推荐