У меня есть таблица информации о продукте со многими столбцами бит. Эта таблица может быть запрошена из интерфейса, который имеет флажок для каждого столбца. Флажки группируются в несколько связанных групп.
Например, три из столбцов описывают пригодность продуктов для различных рынков, например, для автомобилей, авиации и морских перевозок.
Если ни один из этих флажков не установлен, я хотел бы выполнить следующий SQL.
SELECT * FROM Products
если Automotive был проверен, должен быть выполнен следующий SQL
SELECT * FROM Products WHERE Automotive = 1
и если проверено более одного, я хотел бы, чтобы опции были OR'd вместе
SELECT * FROM Products WHERE
Automotive = 1
OR
Aviation = 1
В старых добрых С# и SQL я мог бы достичь этой логики, условно конкретизируя SQL вместе, но у меня возникают проблемы с созданием той же логики с Linq.
Моя проблема заключается в том, как я условно добавляю предложение WHERE и его элементы к моему запросу.
Я бы предпочел иметь только одну точку, в которой выполняется запрос, поэтому, если это возможно, я бы хотел избежать использования С#, если нужно вставить в разные запросы.
Я использовал бы PredicateBuilder для этого.
var query = db.GetTable<Products>().AsQueryable();
var predicate = PredicateBuilder.False<Products>();
if (automotive.Checked)
{
predicate = predicate.Or( p => p.Automotive == 1 );
}
if (aviation.Checked)
{
predicate = predicate.Or( p => p.Aviation == 1 );
}
query = query.Where( predicate );
Если вы пытаетесь выполнить инструкции "ИЛИ", которые проверяют один столбец, вы можете использовать "Содержит" , чтобы выполнить это. Здесь хорошее сообщение в блоге, показывающее, как это работает.
Однако, если вы пытаетесь динамически проверять разные столбцы, это не сработает. В этом случае, вероятно, потребуется несколько операторов.
Наличие значений "Or" и "And" делает эту проблему немного сложнее. Если бы это было "И", то следующее должно делать хорошо
public IEnumerable<Products> GetQuery() {
var query = db.GetTable<Products>();
if ( automotiveBox.Checked ) {
query = query.Where(x => x.Automotive == 1);
}
if ( aviation.Checked ) {
query = query.Where(x => x.Aviation == 1);
}
return query
}
Если он является "Или", хотя я думаю, что ваш единственный вариант - создать дерево выражений вручную и использовать его в качестве предложения Where.