我有以下Linq-to-SQL语句:
return db.Photos.SingleOrDefault(p => p.PhotoID == id
&& includePending ? true : p.Live);
对于includePending,我传递的是假的。在数据库中,“Live”适用于除2张照片以外的所有照片。
然而,不是按预期返回一张照片,而是返回数据库中除2之外的所有照片! PhotoID是主键(因此对于一个项只能是true),而布尔逻辑表示FALSE和TRUE = FALSE。那么这里发生了什么?为什么忽略我的查询的p.PhotoID == id
部分?
答案 0 :(得分:11)
我不记得full precedence rules,但你的情况相当于:
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);
}