Я много искал о своей текущей проблеме, но я не мог найти реальный ответ, чтобы решить эту проблему.
Я пытаюсь создать запрос LINQ, который выдает следующий SQL:
SELECT * FROM TABLE WHERE (Field1 = X, Field2 = Y ... ) or (Field3 = Z)
В обычной ситуации я бы просто сделал это:
Object.Where(c => (c.Field1 == X && c.Field2 == Y) || (c.Field3 == Z))
Я не могу использовать этот подход, потому что запрос строится с использованием нескольких вызовов .Where()
.
Имея пример:
// This is a short example, the real world situation has 20 fields to check and they are all connected with an AND.
if (model.Field1.HasValue)
{
Query = Query.Where(c => c.Field1 == X)
}
if (model.Field2.HasValue)
{
Query = Query.Where(c => c.Field2 == X)
}
[...] like 20 more of these .Where() calls.
и вот как мне это сложно. Все эти .Where()
вызовы создают запрос Linq, связанный с AND
, что нормально.
Как разрешить им выполнять с круглыми скобками и добавить простой OR
теперь с помощью API?
Есть ли способ сохранить предикат в некоторых переменных, чтобы я мог сделать что-то вроде:
Query = Query.Where(c => previousPredicates || c.Field3 == X)
или как решить эту проблему?
Я думаю, что для этой конкретной проблемы должно быть хорошее решение, и я не единственный, кому она нужна, но я абсолютно не уверен, как ее решить.
P.S .: Я не могу удалить несколько вызовов .Where()
, и написание прямого SQL не вариант.
EDIT
StackOverflow хочет, чтобы я сказал, почему мой вопрос отличается от других. Ну, дело в Parentheses
. Я не хочу связывать все .Where()
с одним предложением OR, я хочу оставить их с AND
и добавить еще одно предложение OR
, пока все запросы AND
заключены в скобки.