当我执行以下代码时,出现错误:
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(使用前将#替换为@)