EF Core中Linq to Entity GroupBy查询无法翻译 免客户端计算方案求助
问题根因
你当前遇到的翻译失败问题有两个核心诱因:
- 你的分组键包含了
Contacto表的主键IdContacto,天然每个分组仅对应1条记录,GroupBy操作属于冗余逻辑,没必要使用分组 - EF Core 不支持
GroupBy之后直接对分组内的完整实体调用First()再访问嵌套属性,只能对简单字段执行聚合操作,因此无法解析g.First().per.Nombre的写法
可行解决方案
方案1(最优,推荐):去掉冗余GroupBy
既然每个Contacto仅对应唯一的Persona,直接投影结果即可,完全不需要分组逻辑,性能更高,可100%被EF Core翻译:
var query = from cont in _gpiContext.Contacto join per in _gpiContext.Persona on cont.IdPersona equals per.IdPersona where cont.IdCliente == idCliente && cont.IdTipoContacto == tipoContacto.IdTipoContacto select new Representante { IdContacto = cont.IdContacto, IdCliente = cont.IdCliente, IdPersona = cont.IdPersona, Nombre = per.Nombre }; return await query.ToListAsync();
方案2:调整GroupBy写法适配EF Core翻译规则
如果你因为业务需要必须保留分组逻辑,将需要聚合的字段提前投影出来再调用First()即可:
var query = from cont in _gpiContext.Contacto join per in _gpiContext.Persona on cont.IdPersona equals per.IdPersona where cont.IdCliente == idCliente && cont.IdTipoContacto == tipoContacto.IdTipoContacto // 直接将需要取的Nombre作为分组元素 group per.Nombre by new { cont.IdCliente, cont.IdContacto, cont.IdPersona } into g select new Representante { IdContacto = g.Key.IdContacto, IdCliente = g.Key.IdCliente, IdPersona = g.Key.IdPersona, Nombre = g.First() }; return await query.ToListAsync();
补充建议
如果你使用的EF Core版本低于3.1,建议升级到6.0/8.0等LTS版本,旧版本对GroupBy的翻译支持存在大量已知缺陷,新版本可以避免很多同类问题。
内容的提问来源于stack exchange,提问作者Gerardo Buenrostro González
相关产品推荐
相关产品推荐

