最简奇偶筛选用 x % 2 == 0 判偶、x % 2 != 0 判奇;注意负数取模符号性、可空类型需判空、浮点数不可用 %;EF Core 6+ 支持直接翻译,旧版需 EF.Functions.Mod 或位运算;务必验证负数、null 和小数场景。
Where筛选奇偶数的最简写法
直接用 % 运算符判断余数就行,别绕弯写 math.abs(x) % 2 == 1 或调用额外方法。c# 的 int、long 等整型对负数取模结果是带符号的(比如 -3 % 2 == -1),但奇偶性只看是否能被 2 整除,所以用 x % 2 == 0 判偶、x % 2 != 0 判奇最稳。
-
numbers.Where(x => x % 2 == 0)—— 偶数(含 0) -
numbers.Where(x => x % 2 != 0)—— 奇数(含负奇数,如 -1、-3) - 如果数据源是
uint、ulong,% 2同样安全,无需转int
Where里写错条件导致空结果的常见原因
不是逻辑写错了,而是类型或值本身出人意料。比如你以为传进来的是整数列表,实际是 double 或 decimal,这时 x % 2 直接编译不过;或者数据里混了 null(比如 IEnumerable<int></int>),x % 2 会抛 NullReferenceException。
- 检查泛型类型:确认是
IEnumerable<int></int>而非IEnumerable<object></object>或可空类型 - 可空类型要先判空:
nums.Where(x => x.HasValue && x.Value % 2 == 0) - 浮点数不能用
%,改用Math.Floor(x) % 2 == 0前得确保它真是整数值,否则会有精度误差
性能敏感场景下避免重复计算
在循环内或大数据量 Where 中,如果奇偶判断只是中间步骤,后面还要用原值做其他运算,别在 Where 里反复取模。一次算清,用 let 或提前投影更清晰。
- 不推荐:
list.Where(x => x % 2 == 0).Select(x => x * x + x % 2)(x % 2算了两次) - 推荐:
list.Select(x => new { Value = x, IsEven = x % 2 == 0 }).Where(t => t.IsEven).Select(t => t.Value * t.Value + (t.IsEven ? 0 : 1)) - 更轻量的写法是用局部变量或提取方法,尤其当判断逻辑变复杂时(比如“能被 2 或 3 整除”)
Entity Framework 中 Where 奇偶筛选的陷阱
EF Core 6+ 支持 x % 2 == 0 直接翻译成 SQL 的 WHERE x % 2 = 0,但低版本(如 EF Core 5)可能报 InvalidOperationException: The LINQ expression could not be translated。
- 遇到翻译失败,改用
EF.Functions.Mod(x, 2) == 0(需引入Microsoft.EntityFrameworkCore) - SQL Server 下也可用
x & 1 == 0(位与),EF Core 通常能识别,且数据库执行更快 - 注意:SQLite 不支持
%运算符在 WHERE 子句中直接使用,得用CAST(x AS INTEGER) % 2或换用ABS(x) % 2
奇偶判断看着简单,但跨类型、跨框架时,% 的行为差异和翻译能力边界最容易被忽略。写完记得查生成的 SQL 或跑个含负数、null、小数的真实数据集验证一下。










