SQL转LINQ报错:多条件JOIN使用&&语法错误求助
解决多条件连接的SQL转LINQ错误
你的LINQ代码错误出在X4AlarmConfigs的连接部分,LINQ的Join方法不支持直接用&&拼接两个键选择器表达式。多条件连接的正确做法是用匿名对象封装需要匹配的多个字段,让LINQ通过对象属性的相等性完成多条件AND的连接逻辑。
以下是完整的修正后LINQ代码,完全对应你的原SQL查询:
var finalAlarm = xAMRuntimeX4Context.X4Journals // 连接X4InstanceRemarks .Join(xAMControlX4Context.X4InstanceRemarks, j => j.InstanceID, i => i.Instance_ID, (j, i) => new { j, i }) // 连接AutomationControlPropertyRemarks .Join(xAMControlX4Context.AutomationControlPropertyRemarks, ppc => ppc.j.PropertyID, p => p.Property_ID, (ppc, p) => new { ppc.j, ppc.i, p }) // 多条件连接X4AlarmConfigs(关键修正部分) .Join(xAMControlX4Context.X4AlarmConfigs, // 左边封装需要匹配的两个字段 combined => new { InstanceID = combined.j.InstanceID, PropertyID = combined.j.PropertyID }, // 右边封装对应的匹配字段 a => new { InstanceID = a.X4Instance_ID, PropertyID = a.X4Property_ID }, (combined, a) => new { combined.j, combined.i, combined.p, a }) // 连接X4AlarmGroups .Join(xAMControlX4Context.X4AlarmGroups, prev => prev.a.X4AlarmGroup_ID, g => g.ID, (prev, g) => new { prev.j, prev.i, prev.p, prev.a, g }) // 过滤语言条件 .Where(result => result.i.Language == "iv" && result.p.Language == "iv") // 按OnTime降序排序 .OrderByDescending(result => result.j.OnTime) // 投影成需要的结果结构 .Select(result => new { ID = result.j.ID, AlarmAppearTime = result.j.OnTime, AlarmDisappearTime = result.j.OffTime, AlarmAckTime = result.j.OnNoticeTime, AlarmCloseTime = result.j.OffNoticeTime, AssetID = result.j.InstanceID, Asset = result.i.RemarkPath, MessageID = result.j.PropertyID, AlarmMessage = result.p.Remark, PriorityID = result.a.X4AlarmGroup_ID, PriorityGroup = result.g.Name });
关键修正说明:
- 在连接
X4AlarmConfigs时,通过匿名对象new { InstanceID = ..., PropertyID = ... }同时传递两个连接字段,LINQ会自动将这两个字段的相等关系作为AND连接条件,完全对应原SQL中的ON j.InstanceID = a.X4Instance_ID AND j.PropertyID = a.X4Property_ID。 - 后续补充了原SQL中缺失的
X4AlarmGroups连接、WHERE过滤条件、ORDER BY排序,以及最终的字段投影,确保和原SQL逻辑完全一致。
内容的提问来源于stack exchange,提问作者ADIL HASSAN
相关产品推荐
相关产品推荐

