2016-06-21 6 views
1

К сожалению, я искал и прочитал около десятка связанных постов, но не совсем найти то, что мне нужно ...LINQ вложенного Состояние

Я хочу, чтобы возвращать объекты, как так:

((Status == 1 || Status == 2) && Value = 'Green') 

Конечно, я не могу использовать круглые скобки в Linq, как я могу в SQL. Я попытался следующие:

list.Where(x => x.Status == 1 || x.Status == 2) 
    .Where(x => x.Value == 'Green') 

// or... 
list.Where(x => x.Value == 'Green') 
    .Any(x => x.Status == 1 || x.Status == 2) 

// or... 
list.Where(x => x.Status == 1 || x.Status == 2) 
    .Any(x => x.Value == 'Green') 

(или несколько других вариантов их)

Является ли один метод больше «правильной», чем другой?

В то время как я могу дубасить некоторые результаты из него, у меня есть две основные проблемы:

  1. который является хорошим тоном (если есть один), и
  2. Мои индексы оптимизированы для статуса предикат первый ... Linq достаточно умный, чтобы реализовать это, и/или делает определенную версию выше, гарантируя, что предикаты индекса распространяются в оптимальном порядке?
+2

Что не так с 'x => ((x.Status == 1 || x.Status == 2) && x.Value = 'Green')' – dasblinkenlight

+0

@dasblinkenlight - ничего, по-видимому ... это был первый вещь, которую я пробовал, но у меня, должно быть, был какой-то синтаксис неправильный (фактическое условие более сложное). Ваш комментарий побудил меня повторить это и, похоже, сейчас. Еще наполовину любопытно о №2 в моем вопросе, но если вы разместите свой комментарий в качестве ответа, я помету его. благодаря – jleach

ответ

0

Ваше выражение должно работать:

.Where(x => (x.Status == 1 || x.Status == 2) && x.Value = 'Green') 

Первое выражение из списка альтернатив, т.е.

list.Where(x => x.Status == 1 || x.Status == 2) 
    .Where(x => x.Value == 'Green') 

является его логическим эквивалентом. Когда LINQ переводится на некоторые СУБД, эти два подхода создают эквивалентный SQL. Когда LINQ используется в памяти, два предложения Where выполняются один за другим, но общий результат тот же.

Альтернативы №2 и №3 не являются одинаковыми, поскольку Any(...) производит true или false в зависимости от наличия или отсутствия записей, соответствующих их предикату среди результатов.