Тернарный оператор с Linq-to-SQL вызывает проблемы? - PullRequest
2 голосов
/ 01 июня 2011

У меня есть следующий оператор Linq-to-SQL:

return db.Photos.SingleOrDefault(p => p.PhotoID == id
                                              && includePending ? true : p.Live);

Для includePending я передаю false.В базе данных «Live» верно для всех фотографий, кроме 2.

Однако вместо того, чтобы возвращать одну фотографию, как ожидалось, она возвращает ВСЕ фотографии в базе данных, кроме 2!PhotoID является первичным ключом (поэтому может быть истинным только для одного элемента), и логическая логика утверждает, что FALSE AND TRUE = FALSE.Так что здесь происходит?Почему игнорируется часть p.PhotoID == id моего запроса?

1 Ответ

11 голосов
/ 01 июня 2011

Я не помню полных правил приоритета наизусть, но ваше состояние эквивалентно:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...