EF Core 8中LINQ into关键字失效,请求改写查询适配
解决EF Core 8中LINQ查询翻译失败的问题
原查询在EF .NET Framework中可正常运行,但EF Core 8无法翻译链式左连接后的分组逻辑,核心原因是EF Core对这类复杂嵌套的透明标识符处理存在限制。通过重构查询逻辑,将分组统计改为子查询关联的方式,即可让EF Core正确翻译执行。
改写思路
- 先从
LoadAdmin筛选出符合条件的记录作为主数据集 - 针对
ChargesAdmin和DepartmentAdmin分别编写独立子查询,统计每个UserName对应的有效ID去重计数 - 避免多左连接后直接分组的复杂结构,改用主数据集关联子查询结果的方式
改写后的代码(无导航属性依赖)
var loadadminsearchdb = ( from LA in _logisticsRMISContext.LoadAdmin where LA.ActiveFlag == true && LA.CompanyCode == CompanyCode // 统计当前用户对应的LoadAdmin中SalesPersonID去重数量 let loadSpCount = _logisticsRMISContext.LoadAdmin .Where(la => la.UserName == LA.UserName && la.ActiveFlag == true && la.CompanyCode == CompanyCode) .Select(la => la.SalesPersonID) .Distinct() .Count() // 统计当前用户对应的ChargesAdmin中有效SalesPersonID去重数量 let chargesSpCount = _logisticsRMISContext.ChargesAdmin .Where(ca => ca.UserName == LA.UserName && ca.CompanyCode == LA.CompanyCode && ca.ActiveFlag == true && ca.SalesPersonID != null) .Select(ca => ca.SalesPersonID) .Distinct() .Count() // 统计当前用户对应的DepartmentAdmin中有效DepartmentID去重数量 let departmentCount = _logisticsRMISContext.DepartmentAdmin .Where(da => da.UserName == LA.UserName && da.ActiveFlag == true && da.DepartmentID != null) .Select(da => da.DepartmentID) .Distinct() .Count() // 按用户唯一信息分组,避免重复数据 group new { LA, loadSpCount, chargesSpCount, departmentCount } by new { LA.UserName, LA.EmailAddress, LA.DisplayName, LA.CompanyCodeNavigation.CompanyName } into g select new { g.Key.UserName, g.Key.EmailAddress, g.Key.DisplayName, g.Key.CompanyName, loadspcount = g.First().loadSpCount, chargesspcount = g.First().chargesSpCount, departmentcount = g.First().departmentCount } ).ToList();
更简洁的改写方式(依赖导航属性)
如果实体类已配置好关联导航属性(比如LoadAdmin与ChargesAdmin通过UserName+CompanyCode关联),可以用更简洁的写法:
var loadadminsearchdb = ( from LA in _logisticsRMISContext.LoadAdmin .Include(la => la.ChargesAdmins) .Include(la => la.DepartmentAdmins) where LA.ActiveFlag == true && LA.CompanyCode == CompanyCode group LA by new { LA.UserName, LA.EmailAddress, LA.DisplayName, LA.CompanyCodeNavigation.CompanyName } into g select new { g.Key.UserName, g.Key.EmailAddress, g.Key.DisplayName, g.Key.CompanyName, loadspcount = g.Select(la => la.SalesPersonID).Distinct().Count(), chargesspcount = g.SelectMany(la => la.ChargesAdmins) .Where(ca => ca.ActiveFlag == true && ca.SalesPersonID != null) .Select(ca => ca.SalesPersonID) .Distinct() .Count(), departmentcount = g.SelectMany(la => la.DepartmentAdmins) .Where(da => da.ActiveFlag == true && da.DepartmentID != null) .Select(da => da.DepartmentID) .Distinct() .Count() } ).ToList();
关键说明
- 原查询的问题在于多左连接后直接分组,EF Core无法生成对应的SQL;改写后将统计逻辑拆分为独立子查询或利用导航属性的
SelectMany,让EF Core能正确解析翻译 - 无导航属性的方案兼容性更强,无需修改实体配置;导航属性方案更简洁,但需要提前配置好实体间的关联关系
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

