Удаление предложения WHERE в запросе Linq - PullRequest
2 голосов
/ 30 октября 2009

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

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

Если ни один из этих флажков не установлен, я бы хотел, чтобы был выполнен следующий SQL.

SELECT * FROM Products

если был проверен Automotive, должен быть выполнен следующий SQL

SELECT * FROM Products WHERE Automotive = 1

и если проверено более одного, я бы хотел, чтобы опции были ИЛИ вместе

SELECT * FROM Products WHERE 
    Automotive = 1 
    OR 
    Aviation = 1

В старых добрых C # и SQL я мог добиться этой логики, условно объединив SQL, но у меня возникли проблемы с созданием той же логики с Linq.

Моя проблема заключается в том, как условно добавить предложение WHERE и его элементы в мой запрос.

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

Ответы [ 3 ]

6 голосов
/ 30 октября 2009

Я бы использовал для этого 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 );
3 голосов
/ 30 октября 2009

Если вы пытаетесь объединить операторы «ИЛИ», которые проверяют один столбец, вы можете использовать Содержит для достижения этой цели. Вот хорошее сообщение в блоге , показывающее, как это работает.

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

3 голосов
/ 30 октября 2009

Наличие значений «И» и «И» делает эту проблему немного сложнее. Если бы это было «И», то следующее должно работать нормально

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...