如何在C# LINQ中使用NOT EXIST和EXIST实现指定SQL逻辑?
如何将带EXISTS判断的SQL转换为C# LINQ
原SQL核心逻辑回顾
需要同时满足三个条件才执行插入:
@IDOut > 0- tbl1中不存在
Color='Red'、VinId=@VinID、ParentId=@ParentID的记录 - tbl2中存在
DetailDesc=@DetailDesc、PayId=1的记录
正确的LINQ实现
可以直接用Any()方法对应SQL中的EXISTS判断,!Any()则对应NOT EXISTS。以下是完整代码实现:
// 先判断所有触发插入的条件是否满足 bool shouldInsert = IDOut > 0 && !tbl1.Any(t1 => t1.Color == ColorEnum.Red && t1.VinId == input.VinId && t1.ParentId == input.ParentId) && tbl2.Any(t2 => t2.DetailDesc == input.DetailDesc && t2.PayId == 1); if (shouldInsert) { // 构造要插入的实体 var newRecord = new tbl1 { ParentId = input.ParentId, Color = ColorEnum.Red, VinId = input.VinId, DateEntered = DateTime.Now, // 对应SQL的GetDate() CreatedDateTime = IDOut, // 对应原SQL的@IDOut参数 // MasterId字段需根据实际业务补充赋值 }; tbl1.Add(newRecord); // 若使用EF框架,需调用SaveChanges()提交变更 // dbContext.SaveChanges(); }
你原代码的问题说明
- 逻辑反转:你原查询是找
Color!=Red且VinId、ParentId不匹配的记录,这和原SQL“不存在匹配Red的目标记录”的逻辑完全相反,应直接判断符合条件的记录是否不存在(!Any(...))。 - 缺少tbl2的存在性判断:原SQL中的第二个
EXISTS对应LINQ的tbl2.Any(...),你未添加该条件。 - 性能冗余:用
ToList()再Count()>0完全没必要,Any()方法会在找到第一条符合条件的记录后立即停止查询,比加载所有数据再统计高效得多。
内容的提问来源于stack exchange,提问作者Sayeed Ahmed
相关产品推荐
相关产品推荐

