Linq到SQL的三元运算符导致问题
本文关键字:运算符 三元 问题 SQL Linq | 更新日期: 2023-09-27 17:58:03
我有以下Linq-to-SQL语句:
return db.Photos.SingleOrDefault(p => p.PhotoID == id
&& includePending ? true : p.Live);
对于includePending,我传递的是false。在数据库中,"Live"适用于除2张照片以外的所有照片。
然而,它并没有像预期的那样返回一张照片,而是返回数据库中除2张外的所有照片!PhotoID是主键(因此只能对一个项目为true),布尔逻辑表示FALSE and true=FALSE。这是怎么回事?为什么它忽略了我查询的p.PhotoID == id
部分?
我记不清完整的优先级规则,但您的条件相当于:
p => (p.PhotoID == id && includePending) ? true : p.Live
而你想要:
p => p.PhotoID == id && (includePending ? true : p.Live)
只需使用后一种形式使其明确,甚至将其更改为不使用条件:
p => p.PhotoID == id && (includePending || p.Live)
我认为这更简单。我建议在这种情况下,即使优先规则对你有利,也要使用括号来使逻辑更清晰。
你甚至可以使用两个where子句:
.Where(p => p.PhotoID == id)
.Where(p => includePending || p.live)
甚至条件化第二个:
var query = ...
.Where(p => p.PhotoID == id);
if (!includePending)
{
query = query.Where(p => p.live);
}