EF Core关联表匹配过滤的LINQ表达式抛出翻译错误如何解决
报错原因分析
- 核心问题出在过滤逻辑里的
p.Personentypzuordnungens.ToList()调用:在EF Core的查询管道中,ToList()是客户端执行方法,无法被翻译成SQL语句执行,会直接打断查询的翻译流程。 - 其次,内存集合
user.personenTypFilter与数据库导航属性的嵌套Any查询,属于EF Core原生不支持的翻译场景,无法生成对应的SQL语句。
可正常执行的解决方案
把原有问题过滤代码替换为如下写法即可,该逻辑可以被EF Core正常翻译为SQL的IN查询,执行效率也远高于原有嵌套写法:
// 替换原有报错的Where语句 .Where(p => p.Personentypzuordnungens.Any(u => user.personenTypFilter.Contains(u.Personentyp.Bezeichnung)))
如果需要兼容personenTypFilter为空不过滤的场景,可以提前加判断避免逻辑异常:
public async Task<IActionResult> Filter([FromBody] Filter user) { var query = _context.Personens .Where(p => p.Vorname.ToLower().Contains(user.vorname)) .Where(p => p.Nachname.ToLower().Contains(user.nachname)) .Where(p => p.Anrede.ToLower().Contains(user.anrede)) .Where(p => p.Ort.ToLower().Contains(user.adresse) || p.Plz.Contains(user.adresse) || p.Land.Contains(user.adresse) || p.Bundesland.Contains(user.adresse) || p.Straße.Contains(user.adresse)) .Where(p => p.Firmenbezeichnung.ToLower().Contains(user.firmenbezeichnung)); // 仅当类型过滤列表有值时追加过滤条件 if(user.personenTypFilter != null && user.personenTypFilter.Any()) { query = query.Where(p => p.Personentypzuordnungens.Any(u => user.personenTypFilter.Contains(u.Personentyp.Bezeichnung))); } var result = await query .Where(p => p.ArbeitgeberPersonIdTNavigation.Ort.ToLower().Contains(user.arbeitgeberOrt) || p.ArbeitgeberPersonIdTNavigation.Plz.ToLower().Contains(user.arbeitgeberOrt) || p.ArbeitgeberPersonIdTNavigation.Straße.ToLower().Contains(user.arbeitgeberOrt) || p.ArbeitgeberPersonIdTNavigation.Land.ToLower().Contains(user.arbeitgeberOrt) || p.ArbeitgeberPersonIdTNavigation.Bundesland.ToLower().Contains(user.arbeitgeberOrt)) .Select(p => new { personId = p.PersonId, nachname = p.Nachname, vorname = p.Vorname, plz = p.Plz, firmBez = p.Firmenbezeichnung, ort = p.Ort, personentyp = p.Personentypzuordnungens.Select(i => new { personentypId = i.PersonentypId, }), aktuellePosition = p.AktuellePosition, taetigkeit = p.Tätigkeit, kernkompetenzen = p.Kernkompetenzen, datenReviewedZeitpunkt = p.DatenReviewedZeitpunkt, }).ToListAsync(); return Ok(result); }
内容的提问来源于stack exchange,提问作者Chopper
相关产品推荐
相关产品推荐

