C # linq с использованием нулевых или пустых строк в инструкции where

У меня есть хранимая процедура в моей БД, которая позволяет мне отправлять нули в качестве параметров. Если значение равно null, то оно используется в инструкции where. Однако мне не нужно запрашивать базу данных во второй раз, потому что у меня есть данные в списке привязки.

Я пытался выяснить способ выполнения той же задачи в инструкции Linq. Ниже приведен код Linq, который у меня есть. Иногда имя задания или номер задания могут быть пустыми. Есть ли способ включить оператор, чтобы сказать if not empty, use it в предложении where? Пока единственный способ заставить его работать - это сделать глубокий if/else оператор. Я смотрел вокруг, и похоже, что единственный способ сделать это - с помощью выражения лямбда, а не Linq? Но я не знаю, как это сделать со списком привязки?

  t = new BindingList<Tracking>(
                                 OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
                                 && o.Created <= dateTo.Value
                                 && o.JobNumber.Contains(txtFilterJobNumber.Text)
                                 && o.JobName.Contains(txtFilterJobName.Text)

                                 ).ToList());
0
задан 13 August 2018 в 15:39

2 ответа

Объединив операцию IsNullOrEmpty с фактическим предложением:

 t = new BindingList<Tracking>(
                             OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
                             && o.Created <= dateTo.Value
                             && (string.IsNullOrEmpty(txtFilterJobNumber.Text) || o.JobNumber.Contains(txtFilterJobNumber.Text))
                             && (string.IsNullOrEmpty(txtFilterJobName.Text) || o.JobName.Contains(txtFilterJobName.Text))

                             ).ToList());
1
ответ дан 15 August 2018 в 17:02

Вы можете избежать необходимости записывать условия с помощью операторов нулевого распространения и нулевого коалесцирования:

OmanWorkflow.TrackingData.Where(o => o.Created >= dateFrom.Value
                             && o.Created <= dateTo.Value
                             && (o.JobNumber?.Contains(txtFilterJobNumber.Text) ?? true)
                             && (o.JobName?.Contains(txtFilterJobName.Text) ?? true)
).ToList());

Если o.JobNumber равно null, то эта часть предложения эффективно пропущена (сделана правда). Аналогично для o.JobName.

1
ответ дан 15 August 2018 в 17:02
  • 1
    Выглядит лаконично, но не будет работать, если TrackingData - IQueryable<T> (?. оператор не поддерживается в деревьях выражений). – Ivan Stoev 13 August 2018 в 15:10

Другие вопросы по тегам:

Похожие вопросы: