Linq to SQL Lambda语法:Not In及Where用!排除记录的写法
Linq to SQL Lambda中!的正确位置与Not In实现
嘿,我来帮你搞定这两个问题,用最直白的方式讲清楚:
一、现有Where条件中!的正确放置位置
你现在的查询是筛选出符合StartDate >= startDate 且 EndDate <= 今日的记录,如果要排除这些符合条件的记录,需要把!放在整个条件表达式的外面,用括号把原条件包起来,这样才能否定整个逻辑判断。
正确写法:
.Where(p => !(p.StartDate >= startDate && p.EndDate <= DateTime.Now.Date))
为什么不能直接加在单个条件前?比如!p.StartDate >= startDate,这会先把p.StartDate转成布尔值再否定,完全偏离了你要的逻辑。所以一定要用括号把整个要否定的条件组包裹,再在前面加!。
当然,根据德摩根定律,你也可以拆成等价的更直观写法:
.Where(p => p.StartDate < startDate || p.EndDate > DateTime.Now.Date)
两种写法效果完全一样,选你觉得更易读的就行。
二、Not In的Lambda语法写法
Linq to SQL里实现NOT IN逻辑,核心是用!Contains()方法——因为Contains()会被翻译成SQL的IN,前面加!就变成了NOT IN。
1. 针对内存集合的Not In
比如你有一个内存中的ID列表,要排除这些ID对应的记录:
// 假设要排除的ID集合 List<int> excludedOrderIds = new List<int> { 1, 3, 5 }; // 查询排除这些ID的订单 var query = db.Orders .Where(p => !excludedOrderIds.Contains(p.OrderId));
2. 针对数据库子查询的Not In
如果要排除的是另一个表查询出来的结果(相当于SQL里的子查询NOT IN),写法类似:
// 排除已完成支付的订单(假设Payments表关联OrderId) var query = db.Orders .Where(p => !db.Payments.Select(pay => pay.OrderId).Contains(p.OrderId));
Linq to SQL会自动把这段代码转换成SQL中的NOT IN (SELECT ...)语句。
内容的提问来源于stack exchange,提问作者Frekster
相关产品推荐
相关产品推荐

