Кто-нибудь хочет прокомментировать, должны ли мы использовать |
или ||
и &
или &&
в наших расширениях / запросах LINQ Where ()?
В лямбда-выражениях (таких как те, которые часто используются в Linq) эти операторы действуют как обычно в c #. |
и &
- логические операторы, в то время как ||
и &&
- логические операторы с коротким замыканием. Короткое замыкание хорошо, если вы хотите эффективный код. Короткое замыкание плохо, если вы хотите избежать кода ветвления (возможно, для UnitTest со 100% покрытием). Большинство людей используют короткие замыкания все время, и ветвление их не беспокоит, потому что они избегают использования выражений, которые имеют побочные эффекты, поэтому они не несут вредных последствий, когда некоторые выражения не оцениваются.
Вот пример полезного ветвления при коротком замыкании:
if (DatabaseIsAvailable() && QueryDataAndThereAreResults())
{
//do something with Results
}
Если DatabaseIsAvailable () имеет значение false, QueryDataAndThereAreResults () не будет оцениваться.
Есть ли разница с LINQ to SQL?
Неважно, что вы используете для Linq to Sql. Знаки препинания будут переведены в операторы T-Sql AND
и OR
. После отправки запроса в базу данных оптимизатор плана запросов SqlServer определит, следует ли выполнить короткое замыкание.