You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:04