如何在C# LINQ左外连接中将IN元素校验条件归入JOIN关联子句
解决方案
你只需要把ClinicNotificationRecipient的IN过滤条件提前到join操作的右侧数据源中,调整后的LINQ语句如下:
var q = from c in Clinic // 提前对右表做IN条件过滤,EF会将该条件合并到LEFT JOIN的ON子句中 join cnr in ClinicNotificationRecipient.Where(x => subUserAcctRoleMemberIds.Contains(x.AccountRoleMemberId)) on c.ClinicID equals cnr.ClinicId into g from gcnr in g.DefaultIfEmpty() // WHERE子句仅保留左表的过滤条件 where c.Active == true && c.DoctorID == doctorid select new { c.ClinicID, cnr = gcnr };
原理说明
你之前的写法将IN相关条件放在了全局的where子句中,LINQ解析器会认为这是对整个关联结果集的过滤,因此会把条件放到最终的WHERE语句里。
而提前对右表(ClinicNotificationRecipient)做过滤后,EF在生成SQL时会识别出这是右表的前置筛选规则,会自动合并到LEFT JOIN的ON关联条件中,最终生成的SQL就和你预期的原生SQL完全一致。
内容的提问来源于stack exchange,提问作者hypergamer003
相关产品推荐
相关产品推荐

