使用Linq-to-SQL导致问题的三元运算符?

时间:2011-06-01 07:24:46

标签: c# linq-to-sql

我有以下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部分?

1 个答案:

答案 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);
}