将带参数的SQL左连接转换为C# Linq时遇GroupJoin类型推断错误
修正Linq左连接实现对应SQL功能
你的报错核心原因是连接用的匿名类型属性名不匹配,且未正确传入RoleId参数:
- 原代码中左边匿名类型用了
Id,右边是ModuleId,Linq要求连接双方的匿名类型属性名、类型完全一致 - 左边的
RoleId未绑定API传入的参数值,导致类型推断失败
以下是修正后的代码,完美对应你给出的SQL逻辑:
// 假设API传入的参数为targetRoleId int targetRoleId = 1; var result = await ( from m in _kspContext.Modules join mrm in _kspContext.ModuleRoleMappings // 调整匿名类型属性名,绑定RoleId参数,确保左右属性名、类型一致 on new { ModuleId = m.Id, RoleId = targetRoleId } equals new { mrm.ModuleId, mrm.RoleId } into moduleRoleMapping from subModuleRoleMapping in moduleRoleMapping.DefaultIfEmpty() where m.Active select new ModuleRoleMappingDto() { ModuleId = m.Id, ModuleName = m.ModuleName, // 左连接后subModuleRoleMapping可能为null,用空传播运算符避免空引用 ModuleRoleMappingsId = subModuleRoleMapping?.Id, RoleId = subModuleRoleMapping?.RoleId, Add = subModuleRoleMapping?.Add, Active = subModuleRoleMapping?.Active, Delete = subModuleRoleMapping?.Delete, Edit = subModuleRoleMapping?.Edit, EntryOnly = subModuleRoleMapping?.EntryOnly, Publish = subModuleRoleMapping?.Publish, View = subModuleRoleMapping?.View, }).ToListAsync();
关键说明:
- 连接条件中,左边匿名类型明确指定
ModuleId = m.Id,和右边的mrm.ModuleId属性名统一 - 将API传入的
targetRoleId作为左边匿名类型的RoleId值,实现SQL中mrm.RoleId=1的连接条件 - 由于是左连接,
subModuleRoleMapping可能为null,所有访问其属性的地方加上?.空传播运算符,防止空引用异常
内容的提问来源于stack exchange,提问作者Sangamesh A
相关产品推荐
相关产品推荐

