Удаление предложения WHERE в запросе Linq

2

У меня есть таблица информации о продукте со многими столбцами бит. Эта таблица может быть запрошена из интерфейса, который имеет флажок для каждого столбца. Флажки группируются в несколько связанных групп.

Например, три из столбцов описывают пригодность продуктов для различных рынков, например, для автомобилей, авиации и морских перевозок.

Если ни один из этих флажков не установлен, я хотел бы выполнить следующий 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 и его элементы к моему запросу.

Я бы предпочел иметь только одну точку, в которой выполняется запрос, поэтому, если это возможно, я бы хотел избежать использования С#, если нужно вставить в разные запросы.

Теги:
linq
linq-to-sql

3 ответа

6
Лучший ответ

Я использовал бы 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 );
  • 1
    +1 за удивительность
  • 0
    Именно так! Этот PredicateBuilder является гладким !!
3

Если вы пытаетесь выполнить инструкции "ИЛИ", которые проверяют один столбец, вы можете использовать "Содержит" , чтобы выполнить это. Здесь хорошее сообщение в блоге, показывающее, как это работает.

Однако, если вы пытаетесь динамически проверять разные столбцы, это не сработает. В этом случае, вероятно, потребуется несколько операторов.

3

Наличие значений "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.

  • 0
    Разве это не сработает для случая «или»? Я считаю, что несколько условий Where будут просто объединены в одно предложение Where в сгенерированном SQL. stackoverflow.com/questions/1280871/… Кажется, чтобы поддержать это.
  • 1
    Да, но они будут образовывать регистр «И» в сгенерированном SQL. Вы фактически делаете, где A И где B И где C, а не где (A ИЛИ B ИЛИ C), поскольку для этого требуется оператор SQL другого стиля.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню