You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:40:38